डेल्टा समय कैसे प्राप्त करें और उपयोग करें


14

मेरे पास अपने खेल में देखने और चलने के लिए चूहे हैं, लेकिन वे बहुत धीमे और उपयोग में कठिन हैं। मुझे लगता है कि यह इसलिए है क्योंकि मैं निश्चित गति का उपयोग कर रहा हूं। मैंने सुना है कि बड़ी परियोजनाओं में डेवलपर्स डेल्टा समय का उपयोग करते हैं। मैं ग्लूट में डेल्टा समय की गणना कैसे करूं? मैं डेल्टा समय का उपयोग करके गति की गणना कैसे करूं?


C11 और C ++ 11 में अब नैनोसेकंड घड़ियां भी हैं: stackoverflow.com/a/36095407/895245 || stackoverflow.com/a/5524138/895245
Ciro Santilli .com/ / / /

जवाबों:


18

"डेल्टा समय" दो फ़्रेम अपडेट के बीच का समय व्यतीत करता था (लेकिन इसका उपयोग अन्य संदर्भों में भी किया जा सकता है; यह आमतौर पर एक समय घटाव का परिणाम होता है)।

आप ग्लूटेट विधि और GLUT_ELAPSED_TIME पैरामीटर का उपयोग करके ग्लूट में डेल्टा समय प्राप्त कर सकते हैं , साथ ही अन्य ऑपरेशन भी कर सकते हैं।

निम्न पंक्ति मिलीसेकंड की संख्या लौटाती है क्योंकि ग्लूटइनिट कहा जाता था (या ग्लूटगेट पर पहली कॉल करें (GLUT_ELAPSED_TIME)):

int timeSinceStart = glutGet(GLUT_ELAPSED_TIME);

इसलिए यदि आप प्रत्येक रेंडरिंग लूप में वर्तमान टाइमस्टैनस्टार्ट को पंजीकृत करते हैं, तो आप पुराने को नए से घटाकर डेल्टा को जान सकते हैं।

int oldTimeSinceStart = 0;

while( ... )
{
     int timeSinceStart = glutGet(GLUT_ELAPSED_TIME);
     int deltaTime = timeSinceStart - oldTimeSinceStart;
     oldTimeSinceStart = timeSinceStart;

     //... stuff to update using deltaTime
}

आप इसे लगभग उसी तरह भी कर सकते हैं, घड़ी के साथ C / C ++ CIME लाइब्रेरी का उपयोग करके () और स्थिरांक स्थिर अभिव्यक्ति CLOCKS_PER_SEC जो घड़ी की टिक और दूसरे के बीच संबंध को निर्दिष्ट करता है।


मूल रूप से, आप एक निश्चित समय मान का उपयोग करने के बजाय इस बीते समय के अनुपात में अपने आंदोलनों को अपडेट करने के लिए डेल्टा का उपयोग कर सकते हैं। इस तरह, यदि आपके प्रोग्राम को 60 एफपीएस पर चलाया जाता है या 10 एफपीएस पर चलता है, तो आपके चरित्र की गति की गति लगभग समान होनी चाहिए।


यहाँ एक छोटा सा उदाहरण है: मान लीजिए कि आप x अक्ष पर प्रत्येक सेकंड 10 इकाइयों द्वारा कुछ स्थानांतरित करना चाहते हैं। आप ऐसा कुछ कर सकते हैं (यदि डेल्टा वास्तव में मिलीसेकंड का उपयोग करता है)।

Position.x += 10/1000 * deltaTime;

इस तरह, चाहे आपका कार्यक्रम 2 बार या 100 बार अपडेट किया गया हो, 1 सेकंड बाद में स्थिति लगभग समान होनी चाहिए, और गेम-प्ले एक छोटे कंप्यूटर के कम एफपीएस से कम प्रभावित होता है, अगर यह निश्चित मानों का उपयोग करता है।

  • निश्चित मानों के साथ ==> कम एफपीएस = कम अपडेट = धीमी गति से जबकि उच्च एफपीएस = अधिक अपडेट = बहुत तेज मूवमेंट।

  • डेल्टा के साथ ==> "लगभग" एक ही आंदोलनों।


अंत में, आपको gamedev.stackexchange पर निश्चित समय चरण बनाम चर समय चरण पढ़ना चाहिए ।


यह एक पूर्णांक के रूप में मिलीसेकंड देता है? सकल, और संभवतः पर्याप्त नहीं है। मुझे हमेशा प्लेटफ़ॉर्म-विशिष्ट टाइमर का उपयोग करना पड़ता है और तब प्लेग की तरह ग्लूट से बचा जाता है क्योंकि यह सुपर गेम के लिए महान नहीं है।
सीन मिडिलिचच

@ सीन मैं GLUT का उपयोग नहीं करता हूं, लेकिन यह प्रश्न के पैरामीटर में था इसलिए मैंने इसे ध्यान में रखते हुए उत्तर दिया;) हालांकि, मैं खेल में मिलीसेकंड को संभालने के लिए int की "अपर्याप्तता" के संबंध में आपकी स्थिति से सहमत हूं। । एक positive intआम तौर पर 2.147.483.647 तक जा अगर 4.294.967.295 पर हस्ताक्षर किए और अहस्ताक्षरित अगर ... इसलिए, भले ही हम इस पर विचार छोटे से एक है, 2.147.483.647 मिलीसेकेंड लगभग 25 दिनों का है ... यह काफी सबसे खेल को संभालने के लिए पर्याप्त होना चाहिए टाइमर और यहां तक ​​कि अगर यह पर्याप्त नहीं है हम अभी भी यथोचित उपयोग कर सकते हैं unsigned int(~ 50 दिन) या यहां तक ​​कि एक long long(जैसा कि मैं आमतौर पर करता हूं)।
वाल्केआ

1
@ वल्कि बिंदु अधिकतम नहीं है, यह कम अंत में संकल्प है। चूंकि 60 एफपीएस पर एक एकल फ्रेम सिर्फ 16 2 / 3rds एमएस है, 1ms की सटीकता (पूर्णांक के रूप में मिलीसेकंड का प्रतिनिधित्व करने से) 5% से अधिक के त्रुटि मार्जिन का प्रतिनिधित्व करता है - सिमुलेशन से अधिक से अधिक सिमुलेशन फेंकने के लिए। माइक्रोसेकंड की एक पूर्णांक संख्या सहने योग्य होगी, लेकिन मिलीसेकंड बहुत मोटे हैं।
स्टीवन स्टैडनिक

हाँ, आपको कई चीज़ों के लिए उप-मिलीसेकंड समय की आवश्यकता है और इसे खोजने के लिए एक उच्च-रिज़ॉल्यूशन टाइमर की आवश्यकता होती है, जो GLUT प्रदान नहीं करता है (जो मुझे पता है)। QueryPerformanceCounterविंडोज़ gettimeofdayपर और अन्य लोगों पर उपयोग करने के लिए केवल एक छोटा प्लेटफ़ॉर्म कोड लिखना बुरा नहीं है। आप अपने हाथों को गंदा करने जा रहे हैं और विशेष रूप से C और C ++ में प्लेटफ़ॉर्म एपीआई के कम से कम सामान्य भाजक की तुलना में थोड़ा अधिक लक्ष्य रखें।
सीन मिडिलिचच

ऐसी सटीकता सभी खेलों के लिए उपयोगी नहीं है। हालाँकि यह एक बहुत ही दिलचस्प व्याख्या है जो इंट और घड़ियों से संबंधित आपके दृष्टिकोण के बारे में मेरी पूछताछ का पूरी तरह से उत्तर देता है। मुझे अभी तक उच्च परिशुद्धता घड़ी की आवश्यकता नहीं थी, लेकिन मुझे लगता है कि इस मामले के बारे में अपने ज्ञान को गहरा करने का समय है। धन्यवाद;)
वाल्कीया
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.