আমি সম্প্রতি গেম লুপগুলিতে এই নিবন্ধটি পড়েছি: http://www.koonsolo.com/news/dewitters-gameloop/
এবং প্রস্তাবিত শেষ বাস্তবায়ন আমাকে গভীরভাবে বিভ্রান্ত করছে। এটি কীভাবে কাজ করে তা আমি বুঝতে পারি না এবং এটি একটি সম্পূর্ণ জগাখিচুড়ি মনে হচ্ছে।
আমি নীতিটি বুঝতে পেরেছি: যতটুকু সম্ভব খেলা যতবার সম্ভব রেন্ডার করে স্থির গতিতে গেমটি আপডেট করুন।
আমি এটি গ্রহণ করি আপনি একটি ব্যবহার করতে পারবেন না:
- 25 টিকিটের জন্য ইনপুট পান
- 975 টিক্সের জন্য গেমার রেন্ডার করুন
আপনি যেহেতু দ্বিতীয়টির প্রথম অংশের জন্য ইনপুট পাচ্ছেন এবং এটিকে কী অদ্ভুত লাগবে? বা নিবন্ধে কি চলছে?
মূলত:
while( GetTickCount() > next_game_tick && loops < MAX_FRAMESKIP)
এটি কীভাবে বৈধ?
আসুন তার মানগুলি ধরে নিই।
MAX_FRAMESKIP = 5
আসুন পরবর্তী গেম_টিক ধরে নেওয়া যাক, মূল গেম লুপটি ... 500 বলার আগে, যা সূচনা হওয়ার কয়েক মুহুর্ত পরে বরাদ্দ করা হয়েছিল।
অবশেষে, আমি যেমন আমার গেমের জন্য এসডিএল এবং ওপেনজিএল ব্যবহার করছি, ওপেনজিএল কেবলমাত্র রেন্ডারিংয়ের জন্যই ব্যবহৃত হচ্ছে, ধরে নেওয়া যাক যে GetTickCount()
এসডিএল_আইনিট বলা হওয়ার পরে যে সময়টি এসেছে, তা এটি করে।
SDL_GetTicks -- Get the number of milliseconds since the SDL library initialization.
সূত্র: http://www.libsdl.org/docs/html/sdlgetticks.html
লেখক এটিও ধরে নিয়েছেন:
DWORD next_game_tick = GetTickCount();
// GetTickCount() returns the current number of milliseconds
// that have elapsed since the system was started
আমরা যদি while
বিবৃতিটি প্রসারিত করি তবে :
while( ( 750 > 500 ) && ( 0 < 5 ) )
750 কারণ next_game_tick
নির্ধারিত হওয়ার পরে সময় পেরিয়ে গেছে । loops
আপনি নিবন্ধে দেখতে পারেন শূন্য।
সুতরাং আমরা লুপটি প্রবেশ করেছি, আসুন কিছু যুক্তি করি এবং কিছু ইনপুট গ্রহণ করি।
Yadayadayada।
লুপটির শেষে, যা আমি আপনাকে মনে করিয়ে দিচ্ছি যে আমাদের মূল গেম লুপটির মধ্যে রয়েছে:
next_game_tick += SKIP_TICKS;
loops++;
আসুন কোডটির পরবর্তী পরবর্তী পুনরাবৃত্তিটি কী তা আপডেট করা যাক
while( ( 1000 > 540 ) && ( 1 < 5 ) )
1000 কারণ সময়টি লুপটির পরবর্তী ব্যর্থতায় পৌঁছানোর আগে ইনপুট পেতে এবং স্টাফ করার কাজটি অতিক্রান্ত হয়ে গেছে, যেখানে গেটটিকাউন্ট () পুনরায় কল করা হয়েছে।
540 কারণ, কোডটি 1000/25 = 40, সুতরাং, 500 + 40 = 540
1 কারণ আমাদের লুপটি একবারে পুনরাবৃত্তি হয়েছে
5 , আপনি জানেন কেন।
সুতরাং, যেহেতু লুপটি পরিষ্কারভাবে অবনমিত হয় MAX_FRAMESKIP
এবং উদ্দেশ্যটি না হয় TICKS_PER_SECOND = 25;
কীভাবে গেমটি এমনকি সঠিকভাবে চালানোর কথা রয়েছে?
আমার কাছে অবাক হওয়ার কিছু ছিল না যে আমি যখন এটিকে আমার কোডে প্রয়োগ করি তখন সঠিকভাবে আমি যুক্ত করতে পারি যেহেতু আমি আমার ফাংশনগুলির নাম পরিবর্তন করে ব্যবহারকারীর ইনপুট পরিচালনা করতে এবং নিবন্ধটির লেখক তার উদাহরণ কোডটিতে গেমটি আঁকেন, গেমটি কিছুই করেনি ।
আমি লুপটির fprintf( stderr, "Test\n" );
ভিতরে একটি স্থাপন করেছি যা গেমটি শেষ না হওয়া অবধি মুদ্রণযোগ্য হবে না।
গেমটির লুপটি সেকেন্ডে 25 বার চলছে, গ্যারান্টিযুক্ত, যত দ্রুত গতিতে উপস্থাপন করতে পারে?
আমার কাছে, যদি আমি বিশাল কিছু মিস না করি তবে মনে হচ্ছে ... কিছুই নয়।
এবং এই লুপটি যখন এইরূপ নয়, অনুমিতভাবে 25 বার সেকেন্ডে চলছে এবং তারপরে নিবন্ধটির শুরুতে আমি ঠিক আগে উল্লিখিত গেমটি আপডেট করছি?
যদি তা হয় তবে কেন আমরা সাধারণ কিছু করতে পারি না:
while( loops < 25 )
{
getInput();
performLogic();
loops++;
}
drawGame();
এবং অন্য কোনওভাবে অন্তরোলনের জন্য গণনা করুন।
আমার অত্যন্ত দীর্ঘ প্রশ্নটি ক্ষমা করুন, তবে এই নিবন্ধটি আমার ভালোর চেয়ে বেশি ক্ষতি করেছে। আমি এখন মারাত্মকভাবে বিভ্রান্ত হয়ে পড়েছি - এবং এই সমস্ত উত্থাপিত প্রশ্নের কারণে কীভাবে সঠিক গেম লুপটি প্রয়োগ করা যায় তা সম্পর্কে আমার কোনও ধারণা নেই।