सरल उत्तर है, आप किसी ऐसे खेल में ग्लूटिल्डफंक कॉलबैक का उपयोग नहीं करना चाहते जिसमें किसी प्रकार का अनुकरण हो। इसका कारण यह है कि यह फ़ंक्शन एनीमेशन को तलाक देता है और विंडो ईवेंट हैंडलिंग से कोड आकर्षित करता है लेकिन एसिंक्रोनस रूप से नहीं। दूसरे शब्दों में, विंडो इवेंट्स प्राप्त करना और सौंपना स्टॉल कोड (या जो कुछ भी आप इस कॉलबैक में डालते हैं), यह एक इंटरैक्टिव एप्लिकेशन (इंटरेक्शन, फिर प्रतिक्रिया) के लिए पूरी तरह से ठीक है, लेकिन उस गेम के लिए नहीं जहां भौतिकी या खेल राज्य को प्रगति करनी चाहिए बातचीत से स्वतंत्र या समय प्रस्तुत करना।
आप इनपुट हैंडलिंग, गेम स्टेट और ड्रॉ कोड को पूरी तरह से डिकम्पोज करना चाहते हैं। इसका एक आसान और साफ समाधान है जिसमें ग्राफिक्स लाइब्रेरी को सीधे शामिल नहीं किया गया है (यानी यह पोर्टेबल और कल्पना करना आसान है); आप चाहते हैं कि पूरे गेम लूप समय का उत्पादन करें और अनुकार उत्पादित समय (चंक्स में) का उपभोग करें। हालाँकि आपके द्वारा अपने एनीमेशन में उपभोग किए गए समय की मात्रा को एकीकृत करना महत्वपूर्ण है।
इस पर मुझे जो सबसे अच्छा स्पष्टीकरण और ट्यूटोरियल मिला है वह है ग्लेन फिडलर का फिक्स योर टाइमस्टेप
इस ट्यूटोरियल में पूर्ण ट्रीटमेंट है, हालांकि यदि आपके पास वास्तविक भौतिकी सिमुलेशन नहीं है, तो आप सही एकीकरण को छोड़ सकते हैं लेकिन मूल लूप अभी भी (वर्बोज़ स्यूडो-कोड में) को उबालता है:
// The amount of time we want to simulate each step, in milliseconds
// (written as implicit frame-rate)
timeDelta = 1000/30
timeAccumulator = 0
while ( game should run )
{
timeSimulatedThisIteration = 0
startTime = currentTime()
while ( timeAccumulator >= timeDelta )
{
stepGameState( timeDelta )
timeAccumulator -= timeDelta
timeSimulatedThisIteration += timeDelta
}
stepAnimation( timeSimulatedThisIteration )
renderFrame() // OpenGL frame drawing code goes here
handleUserInput()
timeAccumulator += currentTime() - startTime
}
इस तरह से करने से, आपके रेंडर कोड, इनपुट हैंडलिंग, या ऑपरेटिंग सिस्टम में स्टालों के कारण आपका गेम स्टेट पीछे नहीं पड़ता है। यह विधि भी पोर्टेबल और ग्राफिक्स लाइब्रेरी स्वतंत्र है।
GLUT एक अच्छी लाइब्रेरी है, लेकिन यह कड़ाई से संचालित है। आप कॉलबैक रजिस्टर करते हैं और मुख्य लूप को बंद कर देते हैं। आप हमेशा GLUT का उपयोग करके अपने मुख्य लूप का नियंत्रण सौंपते हैं। इसके चारों ओर प्राप्त करने के लिए हैक हैं , आप टाइमर और इस तरह का उपयोग करके एक बाहरी लूप भी नकली कर सकते हैं, लेकिन एक और पुस्तकालय शायद जाने के लिए एक बेहतर (आसान) तरीका है। कई विकल्प हैं, यहाँ कुछ (अच्छे प्रलेखन और त्वरित ट्यूटोरियल वाले) हैं:
- GLFW जो आपको इनपुट इवेंट इनलाइन (अपने मुख्य लूप में) प्राप्त करने की क्षमता देता है।
- SDL , हालाँकि इसका जोर विशेष रूप से OpenGL नहीं है।