আপনার প্রিয় গেম-নির্দিষ্ট কোডিং রত্নগুলি কী কী? [বন্ধ]


24

আমি জন কারম্যাকের তৃতীয় ভূমিকম্পের দ্রুত বিপরীত স্কোয়ার রুট দিয়ে শুরু করব :

float Q_rsqrt(float number) {

  long i;
  float x2, y;
  const float threehalfs = 1.5F;

  x2 = number * 0.5F;
  y = number;
  i = * ( long * ) &y;
  i = 0x5f3759df - ( i >> 1 );
  y = * ( float * ) &i;
  y = y * ( threehalfs - ( x2 * y * y ) );

  return y;

}

6
এটি আসলে কোনও প্রশ্ন নয় - খুব কমপক্ষে, আপনি এটি একটি সম্প্রদায়ের উইকি পৃষ্ঠা ঘোষণা করতে পারেন ...
রাচেল ব্লাম

সম্পন্ন, সম্প্রদায়ভিত্তিক।
Gak

3
স্ক্রু যে! শুধু দুর্দান্ত জেসি দ্বারা রচিত যে কোনও এবং সমস্ত কোড দিয়ে যান!
অ্যাডাম নায়লার

3
0x5f375a86 (: যাইহোক, মনে রাখবেন যে আরো সঠিক "ম্যাজিক নম্বর" বর্গমূল ফাংশন বিপরীত ফাস্ট ব্যবহার করার জন্য এর যে কি করা en.wikipedia.org/wiki/... )
Ricket

8
এছাড়াও লক্ষ করুন যে এটি জন কারম্যাকের নয়।
কাজ

উত্তর:


25

মানচিত্র মূল্য ফাংশন:

float mapValue( float inVal, float inFrom, float inTo, float outFrom, float outTo )
{
    float inScale = (inFrom != inTo) 
        ? ( ( inVal - inFrom ) / ( inTo - inFrom ) ) 
        : 0.0f;
    float outVal = outFrom + ( inScale * ( outTo - outFrom ) );
    outVal = (outFrom < outTo ) 
        ? clamp( outVal, outFrom, outTo ) 
        : clamp( outVal, outTo, outFrom );
    return outVal;
}

এটি একটি মান নেয়, এটিকে একটি পরিসরের মধ্যে অনুপাতে রূপান্তর করে এবং তারপরে অন্য ব্যাপ্তির সাথে তুলনামূলকভাবে স্কেল করে। ডাবল-লার্পের মতো।

আপনি জিনিসটি স্বাভাবিক করতে এটি ব্যবহার করতে পারেন:

float minDamage = 0.0f; float maxDamage = 300.0f;
float normalisedDamage = mapValue(damange, minDamage, maxDamage, 0.0f, 1.0f);

অথবা আপনি এক ব্যাপ্তি থেকে অন্য রেঞ্জে রূপান্তর করতে পারেন:

float brakeStrength = mapValue(timeToCollision, 
    0.0f, 10.0f, // seconds
    1.0f, 0.2f // brake values 
    );

দ্বিতীয় উদাহরণে লক্ষ্য করুন যে আউট রেঞ্জটি ইন-রেঞ্জের আলাদা অর্ডার।

এটি দেখতে অনেকটা ভাল লাগে না তবে আমি এই জায়গাটি জুড়ে এই ছোট্ট ফেলা ব্যবহার করি।


14

আমি এখনও আমার গেম কোডে পাইথাগোরিয়ান উপপাদকটি কতবার ব্যবহার করতে পারি তা বিশ্বাস করতে পারি না। আমার কাছে, এই সাধারণ সূত্রটি গেম বিকাশের এক রত্ন।

a ^ 2 + b ^ 2 = c ^ 2
(উত্স: mathurl.com )

অথবা

বিকল্প পাঠ
(উত্স: mathurl.com )

এবং যখন কেবল আপেক্ষিক দূরত্বের বিষয়টি বিবেচিত হয় এটি ব্যয়বহুল স্কোয়ার রুট অপারেশন ছাড়াই ব্যবহার করা যায়

বিকল্প পাঠ
(উত্স: mathurl.com )


সত্যি কথা বলতে কি পাইথাগোরিয়ান গণিত সমস্ত গেম কোডের উপরে বিশেষত ইঞ্জিন যেমন পদার্থবিজ্ঞান কোড, রেন্ডারিং কোড, এআই ব্যবহার করা হয়।
নিক বেডফোর্ড

1
সত্য। এ কারণেই এটি রত্ন। ;)
মিঃ ভালডেজ

4
একটি আকর্ষণীয় প্রকরণটি যখন আপনি কেবল আপেক্ষিক দূরত্বগুলি সম্পর্কে যত্নবান হন । তারপরে আপনি সম্ভাব্য ব্যয়বহুল sqrtকল এবং সহজ গণনা এড়িয়ে যেতে পারেন distance2 = x^2 + y^2
mmyers

@ এমমিয়ার্স - আরেকটি দুর্দান্ত জিনিস: আপনি যদি x ^ 2 স্পেসে কাজ করেন তবে দূরত্বটি কেবল আপেক্ষিক নয়।
স্টিভেন এভার্স

আপেক্ষিক দূরত্ব বিট উল্লেখ করার জন্য আপনাকে ধন্যবাদ। আমি অনেকগুলি অপ্রয়োজনীয় স্কোয়ার রুট ক্রিয়াকলাপ দেখেছি, ঠিক তেমন লোকেরা যখন * ব্যবহার করে যখন তাদের কোনও কম সঠিক ব্যবহার করা উচিত।
রিকিট

13

আমার কাছ থেকে সবচেয়ে বড়টি স্কট বিলাসের গেমঅবজেক্ট সিস্টেম সম্পর্কে পড়া ছিল যদিও আমি তার মতো একটি ডেটাবেস সিস্টেম ব্যবহার করি না, এটি আমাকে 6 স্তরের উত্তরাধিকারী গাছগুলি তৈরি করা বন্ধ করে দিয়েছিল এবং আমাকে এমন একটি উপাদান তৈরি করতে সক্ষম করেছে যা অনেক বেশি পরিচালনাযোগ্য এবং পুনরায় ব্যবহারযোগ্য।


10

আমাকে ডাফের ডিভাইস নিয়ে যেতে হবে । এটি কোডের প্রথম ব্লক যা আক্ষরিক অর্থে আমার চোয়ালের ড্রপ তৈরি করেছিল। "আপনি এটা করতে পারেন?!?!"


ঈশ্বর. গগলস! তারা কিছুই করে না!
রাউল

"স্যুইচ-কেস" এর অভ্যন্তরে নেস্টেড "ডু-উইল" আমাকে সর্বদা জ্বলজ্বলে করে তোলে। এমনকি 20 বছর পরে ...
Andreas

1
-1। আমি এই পছন্দ করি না। এটি আজ খুব কার্যকর নয় (আপনি তার memcpyপরিবর্তে ব্যবহার করতে পারেন , যদি আপনি চান অন্য লোকেরা আপনার কোডটি পড়তে সক্ষম হন)
বোবোবো

1
পছন্দ করুন ম্যাকপি সর্বদা আরও পঠনযোগ্য, পোর্টেবল এবং সম্ভবত আরও অনুকূলিত হবে।
কাওড

1
@ কেএওডি: কারণ মেমকিটি ডাফের ডিভাইসের সমতুল্য নয় - এটি যদি একই জিনিস না করে তবে "পঠনযোগ্য, বহনযোগ্য এবং সম্ভবত আরও বেশি অনুকূলিত" হওয়া কোনও ব্যাপার নয়! আধুনিক CPU- র পাইপলাইনগুলি সম্ভবত শাখা ভবিষ্যদ্বাণী এবং নির্দেশ ক্যাশে কারণ এটা দিয়ে চেয়ে ডাফের এর ডিভাইস ছাড়াই ভাল কি করতে হবে, কিন্তু যে হয়েছে কিছুই সঙ্গে কাজ করতে memcpy

7

একটি গেমের একটি ছোট সি / সি ++ স্নিপেট আমি বহু বছর আগে লিখতে সহায়তা করেছি:

(fill ? FillRect : DrawRect) (x, y, w, h, colour);

আমার প্রথম গেমটিতে ( এটি ) আমার 1 এমবি র‌্যামেরও বেশি র‌্যাম অ্যাক্সেস করা দরকার ছিল এবং এটি ইন্টারনেট চালু হওয়ার আগেই আমার কাছে এক্সএমএস এবং ইএমএসের কোনও ডকুমেন্টেশন ছিল না যা ডস অ্যাপস অতিরিক্ত র‌্যাম অ্যাক্সেস করতে ব্যবহার করেছিল।

সুতরাং, আমি একটি ছোট 'ব্যাকডোর' ব্যবহার করে শেষ করেছি যা সেগমেন্ট রেজিস্টারগুলির ক্ষেত্রে 386-এ প্রদর্শিত হয়েছে। সাধারণত, বাস্তব মোডে, ঠিকানাটি গণনা করা হয়েছিল seg*16+offযা আপনাকে 1Mb এর মধ্যে সীমাবদ্ধ করে।

তবে আপনি সুরক্ষিত মোডে স্যুইচ করতে পারেন, 4 এমবি ঠিকানার জন্য একটি সেগমেন্ট সেট আপ করতে পারেন, ফিরে যেতে পারেন এবং আপনি যদি সেগমেন্ট রেজিস্টারে না লিখে থাকেন (যা ঠিক যে ডস কেবলমাত্র 8086 সেগমেন্ট রেজিস্টার ব্যবহার করেছিল), আপনি সম্পূর্ণ অ্যাক্সেস করতে পারবেন ফ্ল্যাট ঠিকানার স্থান হিসাবে 4Mb। আপনি ডস পরিষেবাদিটি ব্যবহার করতে চাইলে রিয়েল মোডে ফিরে যাওয়া দরকার ছিল।

সেখানে অনেকগুলি ডিপিএমআই এক্সটেন্ডার উপলব্ধ ছিল না।


সি # তে প্রায় কাজ করে (আপনার কোনও প্রতিনিধি প্রকার ঘোষণা করতে হবে এবং কমপক্ষে একটি কাস্ট
inোকানো দরকার

আপনি রিয়েল মোডে 32-বিট অ্যাড্রেসিং মোডের সাথে বোঝাতে চান? (যেমন একটি ঠিকানা-আকারের উপসর্গের প্রয়োজন)। আপনি কি নিশ্চিত যে সেগমেন্ট বর্ণনাকারী সেট আপ করা প্রয়োজনীয় ছিল এবং এটি সেগমেন্টের রেজিস্টারটি সাধারণ 16 * এফএস + যাই হোক না কেন ব্যবহার করে না? আমি মনে করি না খণ্ডগুলিও 16-বিট মোডে সীমাবদ্ধতা রেখেছিল, কেবলমাত্র বেস ঠিকানা (16 * তাদের মান), তাই আপনি 16-বিট মোডে [fs:esi]কোনও কিছুতে কেবল এফএস সেট করতে পারেন নি, এবং যা কিছু ব্যবহার করতে পারেন বা যা কিছু অ্যাক্সেস করতে পারেন তা ব্যবহার করতে পারেন চেয়েছিলেন?
পিটার কর্ডেস

আমি এটি চেষ্টা করে দেখিনি, বা 16-বিট মোডের জন্য কোনও আসল কোড লিখেছি, কেবল 32 এবং 64 বিট এএসএম, তবে এটি অদ্ভুত শোনায়। হুঁ, প্রশংসনীয় যদিও। আধুনিক সিপিইউগুলি অবশ্যই সেগমেন্টের স্টাফগুলি অভ্যন্তরীণভাবে ক্যাশে করে এবং যখন আপনি সেগমেন্টের রেগগুলিতে লিখবেন তখন কেবল সেই ক্যাশেগুলি পুনরায় লোড করুন, তাই সম্ভবত এটি কীভাবে এটি সুরক্ষিত-মোড বেস + সীমাবদ্ধ রাখে (যদি এটি আসলে ঘটেছিল তবে আপনি কেবল ব্যবহার করছেন না 4 এমবি 16 * এফএস থেকে শুরু হবে)।
পিটার কর্ডেস

5

অনুমানযোগ্য এলোমেলো সংখ্যার জন্য ব্যক্তিগতভাবে আমি মার্সেন টোইস্টারের একটি বড় অনুরাগী, বিশেষত যদি আপনাকে র‌্যান্ডের বিভিন্ন আলাদাভাবে বীজযুক্ত উদাহরণ তৈরি করতে হয়

http://en.wikipedia.org/wiki/Mersenne_twister


মার্সেন টুইস্টার এই অর্থে দুর্দান্ত যে এটি একটি ভাল এলোমেলো সংখ্যা জেনারেটর, তবে এটি বিশেষভাবে মার্জিত বা শীতল নয় (বা দ্রুত বা বাস্তবায়নের পক্ষে সহজ) নয়। তার জন্য, আপনি en.wikedia.org/wiki/Rule_30 এ দেখতে চাইতে পারেন ।

1
আমরা একটি সাধারণত ব্যবহারের জন্য এমটি চেয়ে ভাল .. হয় en.wikipedia.org/wiki/Well_equidistributed_long-period_linear
জারি Komppa

5

এখানে ক্রিস ক্রফোর্ডের দ্বারা উল্লেখ করা একটি (এবং দৃশ্যত আতারি ব্যবহার করেছেন) যাকে তিনি 'এ গ্রাফিক্স ট্রিক' বলেছেন:

LDA FIRST
EOR SECOND
AND CONTROL
EOR SECOND
STA OUTPUT

একটি ব্যাখ্যা জন্য সম্পূর্ণ নিবন্ধ পড়ুন ।


1
সেই লিঙ্কটি এখন ভেঙে গেছে, সুতরাং এটি এখানে ব্যাখ্যা করতে সহায়তা করবে।
ফিনউইউ

ধন্যবাদ। তিনি গিয়ে আবার নিজের ওয়েবসাইট পরিবর্তন করেছেন। আমি লিঙ্কটি আপডেট করেছি।
অ্যান্টনি

4

কোনও কারণে, লোকেরা প্রায়শই গেমগুলিতে নকশার নিদর্শনগুলির শক্তিকে আন্ডাররেট করে। আমি গেমসে সাফল্যের সাথে প্রায় প্রতিটি জিওএফ প্যাটার্ন প্রয়োগ করেছি।


1
গেমস প্রোগ্রামিং সম্পর্কে আমার পছন্দের একটি জিনিস "নির্ভুলতা" এর মানসম্পন্ন জিওএফ পথ থেকে দূরে চলেছে এবং কেবল খাঁটি সুন্দর গতিতে ফোকাস করছে! এটি বলেছিল, আমি গেমসে এমভিসির অনেকগুলি খারাপ বাস্তবায়ন দেখেছি যা ভালোর চেয়ে বেশি ক্ষতি করে।
আয়েন

আমি মনে করি ডিজাইনের ধরণগুলির নিজস্ব জায়গা আছে। গেমগুলিতে এত কিছু না, যদিও।
blissfreak

@ ব্লিসফ্রোক: গেম প্রোগ্রামিংয়ের ক্ষেত্রে বিশেষ কিছু নেই যা এটিকে কিছুটা বুনো পশ্চিম করে তোলে যেখানে নিদর্শনগুলি সাধারণ নয়। এগুলি হাস্যকরভাবে সাধারণ এবং এখানে কিছু উদাহরণ রয়েছে।
স্টিভেন ইভার্স

4

ম্যাথ.টান 2 () অত্যন্ত কার্যকর (সমস্ত ট্রিগ সহ) with


এটা, গোশ! আমি প্রচুর 3 ডি করেছি এবং সত্যই এর প্রয়োজন হয়নি।
স্কিজ

+1, এক্স + ওয়াই ভেক্টর উপাদান থেকে রেডিয়েন্সের দিকে যাওয়ার একমাত্র উপায়।
আরসিআইএক্স

1
@ আরসিআইএক্স: আমার বক্তব্যটি হ'ল রূপান্তরটি অপ্রয়োজনীয়, অর্থাৎ (x, y) -> কোণ, যে কোনও কোণ সমস্যার জন্য একটি ভেক্টর সমাধান রয়েছে।
স্কিজ

6
আমি সত্যিই একটি খালি স্ট্যান্ডার্ড লাইব্রেরি ফাংশনটিকে "রত্ন" বলব না।

1
@ স্কিজ: সম্ভবত 3 ডি এর জন্য, তবে আমি একটি সাধারণীকৃত ভেক্টর নেওয়ার এবং রেডিয়েন্সের দিকনির্দেশ মানটি বের করার কোনও অন্য উপায় জানি না। যা 2 ডি গেমগুলিতে একটি ভাল ডিল হিসাবে।
আরসিআইএক্স

3

উপরের পাইথাগোরিয়ান রত্ন যুক্ত করার জন্য ...
আমি সবসময় লোকদের বলে থাকি যে 3 ডি প্রোগ্রামিংয়ের জন্য তাদের কেবলমাত্র জানা দরকার:
- a ^ 2 + b ^ 2 = c ^ 2
- soscastoa (পাপ = বিপরীত দিক / opালু দিক, কারণ = সংযুক্ত) / opালু দিক, টান = বিরোধী পক্ষ / সংযুক্ত দিক)
- ক। খ = | ক | * | খ | * কস আলফা
- এ * বি = | এ | * | খ | * সিন আলফা * ইউনিট ভেক্টর
এটি গেম বিকাশের ক্ষেত্রে আপনার মুখোমুখি যে কোনও 3 ডি (বা 2 ডি) সমস্যার সমাধান করতে পারে - 4 টি বিধি।
অবশ্যই, খুব ভাল উপায় আছে, কিন্তু এটি সমস্ত সমাধান করতে পারে - আমার জানা উচিত, আমি একটি হ্যাক যা তাদের উপর একটি কেরিয়ারকে ভিত্তি করে তৈরি করেছি।


5
পুনঃঃস্কোস্টোআ আমি মনে করি বেশিরভাগ লোকই জানেন যে সোহকাহটোয়া ('স্লোপড সাইড' প্রতিস্থাপনের সাথে আরও সুনির্দিষ্ট, যদি স্বীকার হয় যে আরও অস্পষ্ট, 'হাইপেনটেনজ')। জিহ্বা সহজেই প্রবাহিত হয় এবং আমি মনে করি এইভাবে আরও সহজ।
অসমর

1
আমি সর্বদা 'ওমল আরব স্যাট অন হিট উট অ্যান্ড হোলড' পছন্দ করবো, যেহেতু মাধ্যমিক বিদ্যালয় (উচ্চ বিদ্যালয়ের বয়স) এটি আমার মস্তিস্কে চাপানো হয়েছে।
জর্জ ডেকেট

এর রয়েছে " S Ome হে LD এইচ Ippy সি আমে একটি য় এইচ বিজ্ঞাপন টি ripped হে এন একজন সিআইডি"
blissfreak

3

আমার প্রিয় পছন্দের একটি হ'ল লাইফের অ্যাসেম্বলি ভাষার সংস্করণ এবং মাইকেল আবরাশের লেখা "কোড অপটিমাইজেশনের জেন " তে এটি অনুকূলকরণের পুরো বিবরণ ।

কোডিং রত্ন খুঁজতে কারও কাছে আমি তাঁর যে কোনও বইয়ের প্রস্তাব দেব।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.