मैंने हाल ही में गेम लूप्स पर यह लेख पढ़ा: http://www.koonsolo.com/news/dewitters-gameloop/
और अनुशंसित अंतिम कार्यान्वयन मुझे गहराई से भ्रमित कर रहा है। मुझे समझ में नहीं आता कि यह कैसे काम करता है, और यह पूरी तरह से गड़बड़ है।
मैं सिद्धांत को समझता हूं: खेल को एक निरंतर गति से अपडेट करें, जो कुछ भी बचा है वह खेल को यथासंभव कई बार प्रस्तुत करता है।
मैं इसे लेता हूँ आप एक का उपयोग नहीं कर सकते हैं:
- 25 टिक्स के लिए इनपुट प्राप्त करें
- 975 टिक के लिए रेंडर गेम
दृष्टिकोण जब से आप दूसरे के पहले भाग के लिए इनपुट प्राप्त कर रहे हैं और यह अजीब लगेगा? या कि लेख में क्या चल रहा है?
अनिवार्य रूप से:
while( GetTickCount() > next_game_tick && loops < MAX_FRAMESKIP)
वह भी कैसे मान्य है?
आइए उनके मूल्यों को मानें।
MAX_FRAMESKIP = 5
चलो मान लेते हैं next_game_tick, जिसे प्रारंभिक गेम के बाद के क्षणों को सौंपा गया था, इससे पहले कि मुख्य गेम लूप का कहना है ... 500।
अंत में, जैसा कि मैं अपने खेल के लिए SDL और OpenGL का उपयोग कर रहा हूं, OpenGL का उपयोग केवल रेंडरिंग के लिए किया जा रहा है, चलो मान GetTickCount()
लेते हैं कि SDL_Init को कॉल करने के बाद का समय मिलता है, जो यह करता है।
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 ) )
१००० क्योंकि समय बीतने से पहले ही इनपुट मिलता है और सामान करते हुए हम लूप के अगले प्रवेश पर पहुँच जाते हैं, जहाँ GetTickCount () को वापस बुलाया जाता है।
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();
और किसी और तरीके से प्रक्षेप के लिए गणना करें।
मेरे अत्यंत लंबे प्रश्न को माफ कर दो, लेकिन इस लेख ने मुझे अच्छे से अधिक नुकसान पहुंचाया है। मैं अब गंभीर रूप से भ्रमित हूं - और इन सभी उठने वाले सवालों के कारण एक उचित गेम लूप को लागू करने का कोई विचार नहीं है।