सेमी-फिक्स्ड या पूरी तरह से फिक्स्ड टाइमस्टेप?


15

मैं एक iPhone shmup बना रहा हूं और यह तय करने की कोशिश कर रहा हूं कि किस प्रकार के गेम लूप का उपयोग करना है। मैं या तो सेमी-फिक्स्ड टाइमस्टेप या पूरी तरह से फिक्स्ड टाइमस्टेप का उपयोग करना चाहता हूं।

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

फिर पूरी तरह से तय समय के साथ मैं एक प्रक्षेप (dt / FIXED_INTERVAL) कॉल के बाद शून्य या अधिक अपडेट (FIXED_INTERVAL) कर रहा हूं जहां dt <FIXED_INTERVAL प्रति गेम लूप है।

तो ऐसा लगता है कि मुझे जो बड़ा फैसला करना है, वह यह है: क्या मैं एक अद्यतन (dt) को लागू करने की चुनौती को एक परिवर्तनीय dt से निपटना चाहता हूं या क्या मैं प्रक्षेप लागू करने की चुनौती से निपटना चाहता हूं?

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

तो क्या अधिक व्यावहारिक विकल्प है: क्या मैं इसे यह जानते हुए अर्ध-कार्यान्वित करता हूं कि मेरे भौतिकी के अपडेट वैरिएबल डीटी के साथ जटिल हो सकते हैं। या क्या मैं पूरी तरह से निर्धारित का उपयोग करता हूं और गेम स्टेट एब्सट्रैक्शन के साथ आने की कोशिश करता हूं ताकि मैं प्रक्षेप करने के लिए पिछले राज्य और वर्तमान राज्य का ट्रैक रख सकूं?


यहाँ बहुत अच्छी तरह से कवर किया गया: gamedev.stackexchange.com/questions/1589/…
michael.bartnett

1
मैंने उस चर्चा और लिंक को कई बार पढ़ा है। यह वास्तव में है कि मैं इस पोस्ट पर कैसे आया हूं। मेरा प्रश्न मुख्य रूप से इंटरपोलेशन को प्राप्त करने के लिए खेल राज्यों को लागू करने के तरीके के साथ करना है - जो उस चर्चा में बिल्कुल भी शामिल नहीं है।
रयान

जवाबों:


12

पूरी तरह से तय

जब आप प्रत्येक फ़्रेम में एक बार चर चरण में फेंकते हैं, तो आप निश्चित टाइमस्टेप के अधिकांश लाभों को ढीला कर देते हैं।

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

लेख से कुछ प्रकाश डाला

  • एक समय संचायक का उपयोग करें।
  • 60Hz फ्रेम दर के लिए 120Hz भौतिकी दर का उपयोग करें।
  • भविष्य में एक निश्चित कदम का अनुकरण करें और वर्तमान भौतिकी राज्य और भविष्य के भौतिकी राज्य के बीच ड्राइंग कोड को लेर करने के लिए समय संचय के लिए बाएं का उपयोग करें।
  • विभिन्न गोचा

2

क्या आप के रूप में "अर्द्ध तय" और "पूरी तरह से तय" कर रहे हैं timestep, मेरे मन में, का उल्लेख दोनों तय timestep - डीटी है कि आप अपने को गुजर रहे हैं updateकॉल फ्रेम के बीच नहीं बदलता है।

तो, आपका प्रश्न वास्तव में है "क्या मैं प्रतिपादन के उद्देश्यों के लिए प्रक्षेप को लागू करना चाहता हूं?" जवाब है: शायद नहीं

इंटरपोलेशन एक ऐसी चीज है जिसे आप केवल तभी करना चाहेंगे जब आपका निश्चित updateटाइमस्टेप आपके लक्ष्य renderटाइमस्टेप के लिए अलग-अलग हो । यह उन खेलों के लिए असामान्य नहीं है, जिनमें updateकेवल update10 हर्ट्ज पर कॉल करने के लिए एक ज़ोरदार चरण है , लेकिन पूर्ण रूप से प्रस्तुत करना।

जब से आप एक iPhone shmup लिख रहे हैं, न तो आपकी updateऔर न ही आपकी renderज़रूरत विशेष रूप से CPU गहन हो; आप अपने फ्रैमरेट को आसानी से 30 हर्ट्ज या 60 हर्ट्ज पर लॉक कर सकते हैं, कार्यान्वयन से परेशान नहीं हैं, और अभी भी एक चिकनी-दिखने वाला गेम है।


मुझे नहीं मिला। आप कह रहे हैं कि मैं अपने गेम लूप में बड़े dt को लॉक कर सकता हूं - जो कि मेरा फिजिक्स उपभोग करता है? मैं उसको कैसे करू? क्या मैं इसे कैडिसप्लेलिंक के साथ कर सकता हूं? मेरा मतलब है, आप जो% CPU उपयोग कर रहे हैं, मैं मान रहा हूँ? क्या आपको वास्तव में लॉक गेम लूप डीटी मान लेना चाहिए?
रयान

जो मैं कह रहा हूं वह वास्तव में इस बात से उब जाता है: कम से कम जटिल काम करो जो काम करेगा।
ब्लेयर होलोवे

1
विस्तार: इसके dtलिए एक चर का उपयोग करना updateऔर renderसबसे सरल काम है जो काम करेगा, लेकिन आम तौर पर अस्थिरता के लिए भौतिकी इंजन का उपयोग करते समय इससे बचा जाता है। इसलिए, updateएक निश्चित के साथ कॉल करना dt, और उसी दर पर रेंडर करना (यदि आपके updateरन लंबे होते हैं तो फ्रेम गिराना ) आमतौर पर सबसे सरल काम होता है। updateकॉल के बीच वस्तुओं को प्रक्षेपित करने के लिए कोड लिखना आपके कोड में जटिलता जोड़ता है; जटिलता जो आप विशेष रूप से कोई समस्या नहीं हल करने के लिए जोड़ रहे हैं।
ब्लेयर होलोवे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.