मुझे निश्चित या चर समय चरण का उपयोग कब करना चाहिए?


257

गेम लूप को निश्चित या परिवर्तनीय समय चरणों पर आधारित होना चाहिए? क्या कोई हमेशा श्रेष्ठ होता है, या सही विकल्प खेल से भिन्न होता है?

चर समय कदम

भौतिकी के अपडेट को "अंतिम अपडेट के बाद से बीता हुआ समय" तर्क के रूप में पारित किया जाता है और इसलिए फ्रैमर्ट-डिपेंडेंट होता है। इसका अर्थ हो सकता है कि गणना करना position += distancePerSecond * timeElapsed

पेशेवरों : चिकनी, कोड को आसान करने के लिए
विपक्ष : गैर-नियतात्मक, बहुत छोटे या बड़े चरणों में अप्रत्याशित

deWiTTERS उदाहरण:

while( game_is_running ) {
    prev_frame_tick = curr_frame_tick;
    curr_frame_tick = GetTickCount();
    update( curr_frame_tick - prev_frame_tick );
    render();
}

निश्चित समय कदम

अद्यतनों को "समय बीतने" को भी स्वीकार नहीं किया जा सकता है, क्योंकि वे मानते हैं कि प्रत्येक अद्यतन एक निश्चित समय अवधि के लिए है। गणना के रूप में किया जा सकता है position += distancePerUpdate। उदाहरण में रेंडर के दौरान एक प्रक्षेप शामिल है।

पेशेवरों : अनुमानित, नियतात्मक (नेटवर्क सिंक करने में आसान?), स्पष्ट गणना कोड
विपक्ष : वी-सिंक की निगरानी करने के लिए समन्वयित नहीं किया जाता है (जब तक आप प्रक्षेपित नहीं करते हैं तो चिड़चिड़ा ग्राफिक्स का कारण बनता है), सीमित अधिकतम फ्रेम दर (जब तक आप प्रक्षेप नहीं करते), चौखटे के भीतर काम करने के लिए कठिन चर समय कदम (जैसे मान Pyglet या Flixel )

deWiTTERS उदाहरण:

while( game_is_running ) {
    while( GetTickCount() > next_game_tick ) {
        update();
        next_game_tick += SKIP_TICKS;
    }
    interpolation = float( GetTickCount() + SKIP_TICKS - next_game_tick )
                    / float( SKIP_TICKS );
    render( interpolation );
}

कुछ संसाधन


6
अपने खेल के लिए वैरिएबल टाइमस्टेप्स का उपयोग करें और भौतिक विज्ञान के लिए निश्चित चरणों
डैनियल लिटिल

7
मैं यह नहीं कहूंगा कि चर समय चरण को ठीक से कोड करना आसान है क्योंकि निश्चित समय कदम के साथ "आपको हर जगह समयबद्ध चर के साथ सभी गणनाओं को भ्रमित करने की आवश्यकता नहीं है"। ऐसा नहीं है कि यह मुश्किल है, लेकिन मैं एक समर्थक के रूप में "कोड को आसान" नहीं जोड़ूंगा।
pek

सच है, मुझे लगता है कि मैं इस बात का जिक्र कर रहा था कि आपको चर समय के चरणों को प्रक्षेपित करने की आवश्यकता नहीं होगी।
Nick Sonneveld

@ पीके मैं आपसे सहमत हूं। परिवर्तनीय समय कदम में एक सरल कोडित गेम लूप होता है, लेकिन आपको अपनी संस्थाओं में कोड करने के लिए अधिक है जो उस परिवर्तनशीलता के साथ "गति" करने के लिए व्यवहार करते हैं। फिक्स्ड टाइम स्टेप में कोड गेम लूप के लिए एक अधिक जटिल है (क्योंकि आपको सटीक समय की क्षतिपूर्ति के लिए समय के भिन्नताओं की भरपाई करनी होती है, और पुनर्गणना होती है कि इसे जोड़ने के लिए क्या अतिरिक्त विलंब जोड़ना है या कितने अपडेट को छोड़ना है) लेकिन उन संस्थाओं के लिए सरल कोडिंग है हमेशा एक ही समय अंतराल से निपटना होगा। संपूर्ण में से कोई भी अनुमोदन अन्य की तुलना में स्पष्ट रूप से सरल नहीं है।
शिवन ड्रैगन

इस उपकरण से इन visuall जाँच कर सकते हैं: s3.amazonaws.com/picobots/assets/unity/jerky-motion/... हालांकि यह आप कैसे वे विचार करेंगे जब फ्रेम दर अलग-अलग है के बारे में एक विचार नहीं देता है
बडी

जवाबों:


135

प्रश्न से संबंधित दो मुद्दे हैं।

  • क्या भौतिकी चरण दर को फ्रेम दर से बांधा जाना चाहिए?
  • क्या भौतिकी को लगातार डेल्टा के साथ जोड़ा जाना चाहिए?

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

उदाहरण के लिए, यदि डिस्प्ले फ़्रैमरेट 50fps है और सिमुलेशन को 100fps पर चलाने के लिए डिज़ाइन किया गया है, तो हमें भौतिकी को सिंक में रखने के लिए हर डिस्प्ले अपडेट के लिए दो भौतिकी कदम उठाने होंगे।

बॉक्स 2 डी के लिए एरिन कट्टो की सिफारिशों में वह इसकी भी वकालत करते हैं।

इसलिए समय सीमा को अपने फ्रेम दर पर न बांधें (जब तक कि आप वास्तव में, वास्तव में नहीं हैं)।

क्या भौतिकी चरण दर आपके फ्रेम दर से बंधा होना चाहिए? नहीं।


निश्चित कदम बनाम चर कदम पर एरिन के विचार:

Box2D एक कम्प्यूटेशनल एल्गोरिथ्म का उपयोग करता है जिसे एक इंटीग्रेटर कहा जाता है। इंटीग्रेटर्स समय के असतत बिंदुओं पर भौतिकी समीकरणों का अनुकरण करते हैं। ... हमें ज्यादा बदलाव के लिए समय कदम पसंद नहीं है। एक चर समय चरण चर परिणाम उत्पन्न करता है, जो डिबग करना मुश्किल बनाता है।

चर बनाम स्थिर कदम पर ग्लेन के विचार:

अपने टाइमस्टेप को ठीक करें या विस्फोट करें

... यदि आपके पास कार सिमुलेशन में सदमे अवशोषक के लिए वास्तव में कठोर वसंत बाधाओं की एक श्रृंखला है तो डीटी में छोटे बदलाव वास्तव में सिमुलेशन विस्फोट कर सकते हैं। ...

क्या भौतिकी को निरंतर डेल्टा के साथ जोड़ा जाना चाहिए? हाँ।


लगातार डेल्टास के साथ भौतिकी को कदम रखने और अपनी भौतिक अद्यतन दर को फ्रेम दर से बाँधने का तरीका अभी भी समय संचयक का उपयोग नहीं करना है। अपने खेल में मैं इसे एक कदम आगे ले जाता हूं। मैं आने वाले समय के लिए एक चौरसाई समारोह लागू करता हूं। इस तरह बड़े एफपीएस स्पाइक्स भौतिकी को बहुत दूर तक नहीं ले जाते हैं, इसके बजाय वे एक फ्रेम या दो के लिए अधिक तेज़ी से सिम्युलेटेड होते हैं।

आप उल्लेख करते हैं कि निश्चित दर के साथ, भौतिकी प्रदर्शन के साथ सिंक नहीं करेगी। यह सही है अगर लक्ष्य भौतिकी दर लक्ष्य फ्रेम दर के पास है। यह बदतर है कि फ्रेम दर भौतिकी दर से बड़ा है। सामान्य तौर पर, यह आपके लक्ष्य एफपीएस के दो बार भौतिकी अद्यतन दर को लक्षित करने के लिए बेहतर है, अगर आप इसे वहन कर सकते हैं।

यदि आप एक बड़े भौतिकी अद्यतन दर को वहन नहीं कर सकते हैं, तो खींचे गए ग्राफिक्स की तुलना में ग्राफिक्स के पदों को प्रक्षेपित करने पर विचार करें, जिससे कि भौतिकी वास्तव में चलती है और अधिक सुचारू रूप से चलती है।


1
मैंने अपनी मशीन को अपग्रेड करने से पहले और बाद में द फ्लोर जेली खेली है और यह मूर्खतापूर्ण था: यह एक ही बात नहीं थी क्योंकि भौतिकी वास्तव में गेम-लूप से आह्वान किया गया था (और इसलिए फ्रेम-दर से बंधा हुआ है) और इससे नहीं एक टाइमर। मेरी पुरानी मशीन बहुत खराब थी, इसलिए यह धीमी-गति और बहुत तेज गति के बीच लगातार स्विच करती रही और गेमप्ले पर इसका बहुत प्रभाव पड़ा। अब यह सिर्फ बहुत तेज गति पर है। वैसे भी यह खेल एक अच्छा उदाहरण है कि यह समस्या कितनी समस्याग्रस्त हो सकती है (हालांकि अभी भी एक प्यारा खेल है)।
मास्टरमैटिक

55

मुझे लगता है कि वास्तव में 3 विकल्प हैं, लेकिन आप उन्हें केवल 2 के रूप में सूचीबद्ध कर रहे हैं:

विकल्प 1

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

विकल्प 2

ऑब्जेक्ट की गति को अलग करने के लिए प्रत्येक अद्यतन के बीच डेल्टा समय का उपयोग करें। महान सिद्धांत में, खासकर अगर आपके खेल में कुछ भी तेजी या गिरावट नहीं आती है, लेकिन बस एक स्थिर गति से चलती है। व्यवहार में, कई डेवलपर्स इसे बुरी तरह से लागू करते हैं, और यह असंगत टक्कर का पता लगाने और भौतिकी को जन्म दे सकता है। ऐसा लगता है कि कुछ डेवलपर्स सोचते हैं कि यह विधि इससे आसान है। यदि आप इस विकल्प का उपयोग करना चाहते हैं, तो आपको अपने गेम को काफी ऊपर ले जाने की आवश्यकता है और कुछ बड़े-गन मैथ्स और एल्गोरिदम लाने के लिए, उदाहरण के लिए वर्लेट फिजिक्स इंटीग्रेटर (मानक यूलर की तुलना में, जिसका अधिकतर लोग उपयोग करते हैं) और कोलाज का पता लगाने के लिए किरणों का उपयोग करते हैं। इसके बजाय सरल पाइथागोरस दूरी की जाँच करता है। मैंने कुछ समय पहले स्टैक ओवरफ्लो पर इस बारे में एक सवाल पूछा था और कुछ बेहतरीन जवाब मिले:

https://stackoverflow.com/questions/153507/calculate-the-position-of-an-accelerating-body-after-a-certain-time

विकल्प 3

Gaffer का उपयोग करें "अपने समय के कदम को ठीक करें" दृष्टिकोण। विकल्प 1 के अनुसार निश्चित चरणों में गेम को अपडेट करें, लेकिन प्रति फ्रेम कई बार प्रदान किया गया - कितना समय बीत चुका है इसके आधार पर - ताकि खेल तर्क वास्तविक समय के साथ बना रहे, जबकि असतत चरणों में शेष रहे। इस तरह, यूलर इंटीग्रेटर्स और सरल टकराव का पता लगाने वाले गेम लॉजिक को लागू करना आसान है। आपके पास डेल्टा समय के आधार पर ग्राफिकल एनिमेशन को प्रक्षेपित करने का विकल्प है, लेकिन यह केवल दृश्य प्रभावों के लिए है, और ऐसा कुछ भी नहीं है जो आपके मुख्य गेम लॉजिक को प्रभावित करता है। यदि आपके अपडेट बहुत गहन हैं, तो आप संभावित रूप से परेशानी में पड़ सकते हैं - यदि अपडेट पीछे आते हैं, तो आपको अपने गेम को और भी कम संवेदनशील बनाने के लिए अधिक से अधिक उन्हें बनाए रखने की आवश्यकता होगी।

निजी तौर पर, मुझे विकल्प 1 पसंद है जब मैं इसके साथ भाग सकता हूं और विकल्प 3 जब मुझे वास्तविक समय के लिए सिंक करने की आवश्यकता होती है। मैं इस बात का सम्मान करता हूं कि विकल्प 2 एक अच्छा विकल्प हो सकता है जब आप जानते हैं कि आप क्या कर रहे हैं, लेकिन मैं जानता हूं कि मेरी सीमाएं अच्छी तरह से पर्याप्त हैं ताकि इससे दूर रहें।


विकल्प 2 के बारे में: मुझे यकीन नहीं है कि पाइथागोरस दूरी की जांच से एक रेकास्ट कभी भी तेज हो सकता है, सिवाय इसके कि यदि आप पाइथागोरस के अपने आवेदन में बहुत क्रूर बल हैं, लेकिन अगर आप ब्रॉडपेज़ नहीं जोड़ते हैं, तो एक रेकास्ट भी बहुत महंगा होगा।
काज

4
यदि आप असमान समय के साथ वेरलेट का उपयोग करते हैं तो आप बच्चे को स्नान के पानी से बाहर निकाल रहे हैं। Verlet जितना स्थिर है, इसका कारण यह है कि त्रुटियां बाद के समय के चरणों में रद्द हो जाती हैं। यदि समय के चरण समान नहीं हैं, तो ऐसा नहीं होता है और आप भौतिकी भूमि में विस्फोट कर रहे हैं।
drxzcl

विकल्प 3 - जोएल मार्टिनेज के एक्सएनए दृष्टिकोण के विवरण की तरह लगता है।
टॉपर

1
यह एक बहुत अच्छा जवाब है। सभी तीन विकल्पों में अपनी जगह है और यह समझना महत्वपूर्ण है कि वे कब उपयुक्त हैं।
एडम नेलर

सभी MMO के मैंने (EQ, लैंडमार्क / EQNext [cry], PS2 [संक्षेप में], और ESO) पर काम किया है, हमने हमेशा चर फ्रेम समय का उपयोग किया है। मैं उस विशेष निर्णय के लिए कभी पक्षकार नहीं रहा, बस तथ्य के बाद दिखा और दूसरों ने जो निर्णय लिया उसका उपयोग किया।
मार्क स्टीपर

25

मैं वास्तव में जिस तरह से एक्सएनए फ्रेमवर्क को लागू करता है निश्चित समय कदम। यदि दी गई ड्रॉ कॉल में बहुत अधिक समय लगता है, तो यह "कैच अप" होने तक बार-बार अपडेट कॉल करेगा। शॉन हैरग्रेव इसका वर्णन यहां करते हैं:
http://blogs.msdn.com/b/shawnhar/archive/2007/11/23/game-timing-in-xna-game-studio-2-0.aspx

2.0 में, ड्रा व्यवहार बदल गया है:

  • वर्तमान समय तक पकड़ने के लिए जितनी बार आवश्यकता हो अपडेट करें
  • एक बार कॉल ड्रा करें
  • अगले अपडेट का समय आने तक प्रतीक्षा करें

मेरे विचार से सबसे बड़ा समर्थक यह है कि आपने जो उल्लेख किया है, वह यह है कि यह आपके गेम कोड की गणनाओं को इतना सरल बना देता है क्योंकि आपको उस समय चर को पूरे स्थान पर शामिल नहीं करना पड़ता है।

नोट: xna वेरिएबल टाइमस्टेप को भी सपोर्ट करता है, यह सिर्फ एक सेटिंग है।


गेम लूप करने का यह सबसे आम तरीका है। हालांकि, मोबाइल उपकरणों के साथ काम करते समय बैटरी जीवन के लिए यह बहुत अच्छा नहीं है।
नाइट ६६६

1
@ knight666; क्या आप सुझाव दे रहे हैं कि अधिक समय तक उपयोग करने से पुनरावृत्तियों की कम मात्रा बैटरलाइफ़ को बचाएगी?
बाजीगर

यह अभी भी एक परिवर्तनशील अद्यतन है - अपडेट डेल्टा इस आधार पर बदलता है कि फ्रेम ने कुछ निश्चित मूल्य (यानी, 1/30 सेकंड के एक सेकंड) के बजाय कितने समय के लिए प्रस्तुत किया।
डेनिस मुंसी

1
@ डेनिस: जैसा कि मैंने इसे समझा, अपडेट फ़ंक्शन को एक निश्चित डेल्टा के साथ कहा जाता है ...
RCIX

3
@ knight666 उह - आप यह कैसे आंकते हैं? यदि आपके पास vsync है और हकलाना नहीं है - ये तरीके समान होने चाहिए! और अगर आपके पास vsync बंद है , तो आप ज़रूरत से ज़्यादा बार अपडेट कर रहे हैं और शायद बेकार नहीं होने से CPU (और इसलिए बैटरी) बर्बाद कर रहे हैं!
एंड्रयू रसेल

12

एक और विकल्प है - गेम अपडेट और फिजिक्स अपडेट को डिकॉय करना। यदि आप अपने टाइमस्टेप (नियंत्रण से बाहर घूमने की समस्या को ठीक करते हैं तो फ़िज़िक्स इंजन को गेम टाइमस्टेप पर ले जाने की कोशिश करते हैं क्योंकि एकीकरण को अधिक टाइमस्टेप की आवश्यकता होती है जिसमें अधिक समय लगता है जो अधिक टाइमस्टेप की आवश्यकता होती है), या इसे चर बनाते हैं और विजयी भौतिकी प्राप्त करते हैं।

समाधान जो मुझे बहुत दिखता है, वह है भौतिकी को एक निश्चित समय पर, एक अलग धागे में (एक अलग कोर पर) चलाना। गेम इंटरपोलेट या एक्सट्रपलेट्स को दो सबसे हाल के वैध फ्रेम दिए गए हैं जो इसे हड़प सकते हैं। इंटरपोलेशन कुछ अंतराल जोड़ता है, एक्सट्रपलेशन कुछ अनिश्चितता जोड़ता है, लेकिन आपकी भौतिकी स्थिर होगी और आपके टाइमस्टेप को नियंत्रण से बाहर नहीं करेगी।

यह लागू करने के लिए तुच्छ नहीं है, लेकिन खुद को भविष्य का प्रमाण साबित कर सकता है।


8

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

मेरा गेम लूप्स अपडेट करने के लिए फ़्रेम की मात्रा की गणना करता है (चलो इस एफ को कॉल करें), और फिर एफ असतत तर्क अपडेट करें। हर तर्क अद्यतन समय की एक निरंतर इकाई मानता है (जो मेरे खेल में एक सेकंड का अक्सर 1/100 वां हिस्सा है)। प्रत्येक अद्यतन क्रम में किया जाता है जब तक कि सभी एफ असतत तर्क अपडेट नहीं किए जाते हैं।

तर्क चरणों में अपडेट असतत क्यों है? ठीक है, यदि आप निरंतर चरणों का प्रयास करते हैं और उपयोग करते हैं, और अचानक आपके पास भौतिकी गड़बड़ है, क्योंकि गणना की गई गति और दूरी की यात्रा एफ के एक विशाल मूल्य से गुणा की जाती है।

इसका एक खराब क्रियान्वयन सिर्फ एफ = वर्तमान समय - अंतिम फ्रेम समय अपडेट करेगा। लेकिन अगर गणना बहुत पीछे हो जाती है (कभी-कभी परिस्थितियों के कारण आपके नियंत्रण से परे एक और प्रक्रिया जैसे सीपीयू समय चोरी करना), तो आप जल्दी से भयानक लंघन देखेंगे। जल्दी से, उस स्थिर एफपीएस को आपने एसपीएफ़ बनाए रखने की कोशिश की।

मेरे गेम में, मैं "स्मूथ" (सॉर्ट) की अनुमति देता हूं ताकि दो कैच के बीच लॉजिक कैचअप की मात्रा को प्रतिबंधित किया जा सके। मैं इसे क्लैम्पिंग के द्वारा करता हूं: एफ = मिनट (एफ, मैक्स_एफआरएएमईडीईएलटीए) जिसमें आमतौर पर मैक्स_एफआरएएमडीईएलटीए = 2/100 * s या 3/100 * s होता है। इसलिए गेम लॉजिक के बहुत दूर होने पर फ्रेम स्किप करने के बजाय, किसी भी बड़े फ्रेम लॉस को छोड़ दें (जो चीजों को धीमा कर देता है), कुछ फ्रेम को पुनर्प्राप्त करें, और फिर से प्रयास करें।

ऐसा करने से, मैं यह भी सुनिश्चित करता हूं कि खिलाड़ी जो वास्तव में स्क्रीन पर दिखाया गया है, उसके साथ तालमेल बनाए रखें।

अंतिम उत्पाद स्यूडोकोड कुछ इस तरह है (डेल्टा पहले उल्लेख किया गया है):

// Assume timers have 1/100 s resolution
const MAX_FRAME_DELTA = 2
// Calculate frame gap.
var delta = current time - last frame time
// Clamp.
delta = min(delta, MAX_FRAME_RATE)
// Update in discrete steps
for(i = 0; i < delta; i++)
{
    update single step()
}
// Caught up again, draw.
render()

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


उस अंतिम बिंदु से दृढ़ता से सहमत हैं; बहुत सारे खेल में, जब फ्रैमरेट गिरता है तो इनपुट को 'धीमा' करना चाहिए। हालांकि यह कुछ खेलों (यानी मल्टीप्लेयर) में संभव नहीं है, फिर भी अगर यह संभव होता तो बेहतर होता। : P यह केवल एक लंबा फ्रेम होने और फिर खेल की दुनिया को 'सही' अवस्था में लाने से बेहतर लगता है।
Ipsquiggle

एक आर्केड मशीन की तरह फिक्स्ड हार्डवेयर के बिना, आर्केड गेम होने से सिमुलेशन धीमा हो जाता है जब हार्डवेयर नहीं रख सकता है तो धीमी मशीन को धोखा दे सकता है।

जो केवल तभी मायने रखता है जब हम "धोखा" के बारे में परवाह करते हैं। अधिकांश आधुनिक खेल वास्तव में खिलाड़ियों के बीच प्रतिस्पर्धा के बारे में नहीं हैं, बस एक मजेदार अनुभव बनाते हैं।
आईएएन

1
इयान, हम यहां विशेष रूप से आर्केड-शैली के खेल के बारे में बात कर रहे हैं, जो परंपरागत रूप से उच्च-स्कोर-सूची / लीडरबोर्ड संचालित हैं। मैं एक टन shmups खेलता हूं, और मुझे पता है कि अगर मुझे पता चला कि कोई व्यक्ति लीडरबोर्ड में कृत्रिम मंदी के साथ स्कोर पोस्ट कर रहा है तो मैं चाहता हूं कि उनके स्कोर को मिटा दिया जाए।

आपके उत्तर को कम करने की कोशिश नहीं की जा रही है, लेकिन मैं इसे निश्चित चरण के रूप में व्याख्या करूंगा जहां प्रतिपादन सीधे भौतिकी अद्यतन दर से बंधा नहीं है, सिवाय इसके कि भौतिकी पर पकड़ बनाना प्रतिपादन पर प्राथमिकता लेता है। इसमें निश्चित रूप से अच्छे गुण हैं।
एरोनल्स

6

यह समाधान सब कुछ पर लागू नहीं होता है, लेकिन दुनिया में प्रत्येक वस्तु के लिए चर टाइमस्टेप - चर टाइमस्टेप का एक और स्तर है।

यह जटिल लगता है, और यह हो सकता है, लेकिन इसे अपने खेल को असतत घटना सिमुलेशन के रूप में मॉडलिंग के रूप में सोचें। प्रत्येक खिलाड़ी आंदोलन को एक घटना के रूप में दर्शाया जा सकता है जो गति शुरू होने पर शुरू होता है, और गति समाप्त होने पर समाप्त होता है। यदि ऐसी कोई बातचीत होती है जिसके लिए इवेंट को विभाजित करने की आवश्यकता होती है (उदाहरण के लिए टकराव) तो ईवेंट रद्द कर दिया जाता है और ईवेंट कतार पर एक और ईवेंट को धकेल दिया जाता है (जो कि संभवतः एंड टाइम द्वारा सॉर्ट की गई प्राथमिकता कतार है)।

इवेंट कतार से रेंडरिंग पूरी तरह से अलग है। प्रदर्शन इंजन आवश्यक रूप से इवेंट प्रारंभ / समाप्ति समय के बीच बिंदुओं को प्रक्षेपित करता है, और जरूरत के अनुसार इस अनुमान में सटीक या मैला हो सकता है।

इस मॉडल का एक जटिल कार्यान्वयन देखने के लिए, अंतरिक्ष सिम्युलेटर EXOFLIGHT देखें । यह परंपरागत फ़्लाइट टाइम-स्लाइस मॉडल के बजाय, अधिकांश फ़्लाइट सिमुलेटरों से भिन्न निष्पादन मॉडल का उपयोग करता है। इस तरह के सिमुलेशन का मूल मुख्य लूप इस तरह दिखता है, छद्म कोड में:

while (game_is_running)
{
   world.draw_to_screen(); 
   world.get_player_input(); 
   world.consume_events_until(current_time + time_step); 
   current_time += time_step; 
}

अंतरिक्ष सिम्युलेटर में एक का उपयोग करने का मुख्य कारण सटीकता की हानि के बिना मनमाना समय-त्वरण प्रदान करने की आवश्यकता है। EXOFLIGHT में कुछ मिशनों को पूरा होने में खेल-साल लग सकते हैं, और यहां तक ​​कि एक 32x त्वरण विकल्प अपर्याप्त होगा। आपको एक प्रयोग करने योग्य सिम के लिए 1,000,000x से अधिक त्वरण की आवश्यकता होगी, जो एक टाइम-स्लाइस मॉडल में करना मुश्किल है। ईवेंट-आधारित मॉडल के साथ, हम 1 एस = 7 एमएस से 1 एस = 1 वर्ष तक, मनमाना समय दर प्राप्त करते हैं।

समय दर बदलने से सिम का व्यवहार नहीं बदलता है, जो एक महत्वपूर्ण विशेषता है। यदि वांछित दर पर सिम्युलेटर को चलाने के लिए पर्याप्त सीपीयू शक्ति उपलब्ध नहीं है, तो ईवेंट्स ढेर हो जाएंगे और जब तक कि घटना की कतार साफ़ नहीं हो जाती, तब तक हम UI रीफ़्रेशिंग को सीमित कर सकते हैं। इसी तरह, हम जितना चाहें उतनी तेजी से सिम को फॉरवर्ड कर सकते हैं और सुनिश्चित करें कि हम न तो सीपीयू बर्बाद कर रहे हैं और न ही सटीकता का त्याग कर रहे हैं।

इसलिए संक्षेप में: हम एक वाहन को लंबे, इत्मीनान से कक्षा में (रनगे-कुट्टा एकीकरण का उपयोग करके) और एक अन्य वाहन को एक साथ जमीन पर उछाल कर मॉडल कर सकते हैं - दोनों वाहनों को उचित सटीकता पर सिम्युलेट किया जाएगा, क्योंकि हमारे पास वैश्विक समयसीमा नहीं है।

विपक्ष: जटिलता, और इस मॉडल का समर्थन करने वाले किसी भी ऑफ-द-शेल्फ भौतिकी इंजन की कमी :)


5

फ़्लोटिंग पॉइंट सटीकता को ध्यान में रखते हुए और अपडेट को सुसंगत बनाने के लिए निश्चित समय कदम उपयोगी है।

यह एक सरल कोड है, इसलिए इसे आज़माने और यह देखने के लिए उपयोगी होगा कि क्या यह आपके खेल के लिए काम करता है।

now = currentTime
frameTime = now - lastTimeStamp // time since last render()
while (frameTime > updateTime)
    update(timestep)
    frameTime -= updateTime     // update enough times to catch up
                                // possibly leaving a small remainder
                                // of time for the next frame

lastTimeStamp = now - frameTime // set last timestamp to now but
                                // subtract the remaining frame time
                                // to make sure the game will still
                                // catch up on those remaining few millseconds
render()

एक निश्चित समय कदम का उपयोग करने के साथ मुख्य मुद्दा यह है कि तेज कंप्यूटर वाले खिलाड़ी गति का उपयोग करने में सक्षम नहीं होंगे। गेम को केवल 30fps पर अपडेट करने पर 100fps पर रेंडर करना उसी तरह है जैसे 30fps पर रेंडर करना।

कहा जा रहा है, एक से अधिक निश्चित समय कदम का उपयोग करना संभव हो सकता है। तुच्छ वस्तुओं को अपडेट करने के लिए 60fps का इस्तेमाल किया जा सकता है (जैसे UI या एनिमेटेड स्प्राइट्स) और 30fps को नॉन-ट्रिवियल सिस्टम (जैसे फिजिक्स और) अपडेट करने के लिए और यहां तक ​​कि धीमे टाइमर जैसे कि अनुपयोगी ऑब्जेक्ट्स, रिसोर्सेज आदि को हटाने के लिए।


2
यदि गेम सावधानी से बनाया गया है, तो रेंडर विधि 30fps अपडेट करने के लिए इंटरपोलेशन कर सकती है, वास्तव में 30fps पर रेंडरिंग के समान नहीं है।
Ricket

3

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

मैं वास्तव में यह नहीं देख सकता कि एक निश्चित समय कदम एक नेटवर्क पर चीजों को आसान बना देगा, वे सभी सिंक से थोड़ा बाहर होंगे एक मशीन पर और मंदी के साथ शुरू करने के लिए लेकिन एक और चीज़ सिंक से बाहर चीजों को धक्का नहीं देगी।

मैं हमेशा व्यक्तिगत रूप से चर दृष्टिकोण की ओर झुकता रहा हूं, लेकिन उन लेखों के बारे में कुछ दिलचस्प बातें हैं। मैंने अभी भी निश्चित कदमों को काफी सामान्य पाया है, खासतौर पर उन कंसोलों पर जहां लोग फ्रैमर्ट के बारे में सोचते हैं कि पीसी पर बहुत उच्च दर प्राप्त करने की तुलना में लगातार 60 एफपीएस होता है।


5
आपको मूल पोस्ट में गेम लिंक पर Gaffer को जरूर पढ़ना चाहिए। मुझे नहीं लगता कि यह प्रति उत्तर एक बुरा जवाब है, इसलिए मैं इसे वोट नहीं दूंगा, लेकिन मैं आपके किसी भी तर्क से सहमत नहीं हूं ।
बाज़

मुझे नहीं लगता कि निश्चित टाइमस्टेप के परिणामस्वरूप खेल में मंदी कभी जानबूझकर हो सकती है, क्योंकि यह नियंत्रण की कमी के कारण है। नियंत्रण की कमी की परिभाषा के अनुसार आत्मसमर्पण करना है और इस प्रकार यह जानबूझकर नहीं किया जा सकता है। यह वही हो सकता है जो आपके मन में था, लेकिन यह उतना ही है जितना मैं उस पर जाना चाहता हूं। नेटवर्किंग में निश्चित टाइमस्टेप के लिए, वहाँ एक निश्चित प्लस है, क्योंकि एक ही टाइमस्टेप के बिना सिंक्र में दो अलग-अलग मशीनों पर भौतिकी इंजन रखना बहुत असंभव है। चूंकि सिंक करने का एकमात्र विकल्प तब सभी इकाई परिवर्तनों को भेजना होगा, इस तरह से बहुत भारी बैंडविड्थ होगा।
काज

0

Gaffer का उपयोग करें "अपने समय के कदम को ठीक करें" दृष्टिकोण। विकल्प 1 के अनुसार निश्चित चरणों में गेम को अपडेट करें, लेकिन प्रति फ्रेम कई बार प्रदान किया गया - कितना समय बीत चुका है इसके आधार पर - ताकि खेल तर्क वास्तविक समय के साथ बना रहे, जबकि असतत चरणों में शेष रहे। इस तरह, यूलर इंटीग्रेटर्स और सरल टकराव का पता लगाने वाले गेम लॉजिक को लागू करना आसान है। आपके पास डेल्टा समय के आधार पर ग्राफिकल एनिमेशन को प्रक्षेपित करने का विकल्प है, लेकिन यह केवल दृश्य प्रभावों के लिए है, और ऐसा कुछ भी नहीं है जो आपके मुख्य गेम लॉजिक को प्रभावित करता है। यदि आपके अपडेट बहुत गहन हैं, तो आप संभावित रूप से परेशानी में पड़ सकते हैं - यदि अपडेट पीछे आते हैं, तो आपको अपने गेम को और भी कम संवेदनशील बनाने के लिए अधिक से अधिक उन्हें बनाए रखने की आवश्यकता होगी।

निजी तौर पर, मुझे विकल्प 1 पसंद है जब मैं इसके साथ भाग सकता हूं और विकल्प 3 जब मुझे वास्तविक समय के लिए सिंक करने की आवश्यकता होती है। मैं इस बात का सम्मान करता हूं कि विकल्प 2 एक अच्छा विकल्प हो सकता है जब आप जानते हैं कि आप क्या कर रहे हैं, लेकिन मुझे पता है कि मेरी सीमाएं अच्छी तरह से पर्याप्त हैं ताकि आप उससे दूर रहें


यदि आप जवाब देने जा रहे हैं तो कम से कम व्यक्ति को क्रेडिट दें!
प्रिमॉक

0

मैंने पाया है कि 60fps के लिए स्थिर टाइमस्टेप दर्पण सुचारू एनीमेशन देता है। यह वीआर अनुप्रयोगों के लिए विशेष रूप से महत्वपूर्ण है। कुछ भी शारीरिक रूप से मतली है।

परिवर्तनीय टाइमस्टेप वीआर के लिए अनुपयुक्त हैं। कुछ एकता वीआर उदाहरणों पर एक नज़र डालें जो चर टाइमस्टेप्स का उपयोग करते हैं। यह अप्रिय है।

नियम यह है कि यदि आपका 3 डी गेम वीआर मोड में सुचारू है, तो यह गैर-वीआर मोड में उत्कृष्ट होगा।

इन दोनों की तुलना करें (कार्डबोर्ड वीआर ऐप्स)

(परिवर्तनीय टाइमस्टेप्स)

(फिक्स्ड टाइमस्टेप्स)

सुसंगत टाइमस्टेप / फ्रैमरेट प्राप्त करने के लिए आपके गेम को मल्टीथ्रेड किया जाना चाहिए। भौतिकी, UI और रेंडरिंग को समर्पित थ्रेड में अलग किया जाना चाहिए। यह उन्हें सिंक करने के लिए पीयूएसए छिपाना है, लेकिन परिणाम उस दर्पण सुचारू प्रतिपादन हैं जो आप चाहते हैं (वीआर के लिए)।

मोबाइल गेम्स जासूसी हैं। एम्बेडेड सीपीयू और जीपीयू के सीमित प्रदर्शन के कारण चुनौतीपूर्ण है। सीपीएल से जितना संभव हो उतने काम का बोझ उठाने के लिए GLSL (स्लैंग) का उपयोग करें। GPU को पास करने वाले मापदंडों से अधिक जागरूक रहें, बस संसाधनों का उपभोग करता है।

विकास के दौरान हमेशा अपने फ्रैमर्ट को प्रदर्शित करते रहें। असली खेल इसे 60fps पर तय करना है। यह अधिकांश स्क्रीन के लिए और ज्यादातर नेत्रगोलक के लिए मूल सिंक दर है।

आपके द्वारा उपयोग किया जा रहा ढांचा आपको सिंक अनुरोध के बारे में सूचित करने में सक्षम होना चाहिए, या टाइमर का उपयोग करना चाहिए। एक नींद सम्मिलित न करें / इसे प्राप्त करने के लिए देरी का इंतजार करें - यहां तक ​​कि मामूली बदलाव भी ध्यान देने योग्य हैं।


0

परिवर्तनीय समय चरण उन प्रक्रियाओं के लिए हैं जिन्हें जितनी बार संभव हो चलाया जाना चाहिए: रेंडर साइकिल, इवेंट हैंडलिंग, नेटवर्क सामान आदि।

निश्चित समय के चरण तब होते हैं जब आपको पूर्वानुमान और स्थिर होने के लिए किसी चीज की आवश्यकता होती है। इसमें शामिल है, लेकिन भौतिकी और टकराव का पता लगाने तक सीमित नहीं है।

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

बाकी सब कुछ एक चर समय कदम पर चल सकता है (हालांकि पेशेवर रूप से बोल रहा है, यह अक्सर एक अच्छा आइडिया है जो लॉकिंग रेंडरिंग को एक निश्चित समय कदम की अनुमति देता है)। गेम इंजन को उत्तरदायी बनाने के लिए, नेटवर्क संदेशों और उपयोगकर्ता इनपुट जैसी चीजों को जल्द से जल्द संभालना चाहिए, जिसका अर्थ है कि मतदान के बीच का अंतराल आदर्श रूप में यथासंभव छोटा होना चाहिए। इसका आमतौर पर चर होता है।

बाकी सब कुछ अतुल्यकालिक रूप से संभाला जा सकता है, जिससे टाइमिंग एक मूट पॉइंट बन जाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.