2 डी platformers: क्यों भौतिकी framerate पर निर्भर करते हैं?


12

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

क्या 2 डी गेम प्रोग्रामिंग के साथ अनुभवी लोग यह बता सकते हैं कि गेम को इस तरह कोडित क्यों किया गया था? एक स्थिर दर पर चलने वाला भौतिकी पाश बेहतर समाधान नहीं होगा? (वास्तव में, मुझे लगता है कि खेल के कुछ हिस्सों के लिए एक भौतिकी लूप का उपयोग किया जाता है, क्योंकि कुछ संस्थाएं फ्रैमरेट की परवाह किए बिना सामान्य रूप से आगे बढ़ना जारी रखती हैं। आपका चरित्र, दूसरी ओर, ठीक [एफपीएस / 60] तेजी से चलता है।)

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

धन्यवाद, और क्षमा करें यदि प्रश्न भ्रामक था।


अपने प्रश्न के अनुकूल। यहाँ एक बढ़िया लेख है जो आपके द्वारा बताई जा रही समस्याओं को ठीक से कवर करता है, और टाइमस्टेप्स और फ्रेम-रेट्स को संभालने का "सही" तरीका है। gafferongames.com/game-physics/fix-your-timestep
संख्या 1

यह वास्तव में मुझे आश्चर्यचकित करता है कि वे इसे इस तरह से करेंगे। मुझे लगता है कि यह होना चाहिए क्योंकि यह मुख्य रूप से कंसोल के लिए बनाया गया था, जहां फ्रेम दर पर भरोसा किया जा सकता है। निराशाजनक!
इयान

जवाबों:


7

क्यों?

कारणों में से कुछ, अपने लेने: वे किसी भी बेहतर पता नहीं था। । यह जल्दी और लागू करने के लिए आसान है। वे गेमप्ले पर अधिक ध्यान केंद्रित करते थे और किनारे के मामलों पर कम होते थे जो ज्यादातर मामलों में फसल नहीं कर सकते हैं।

आपने समझाने का बहुत अच्छा काम किया कि क्यों नहीं। मुझे यकीन है कि आपने देखा है कि विषय को कवर करने वाले बहुत सारे विषय हैं । मुझे यकीन नहीं है कि आपने जो सूचीबद्ध किया है, उससे परे आपको संतोषजनक उत्तर मिलेगा।


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

4

एसएमबी मूल रूप से एक कंसोल गेम था, जहां यह मान लेना सुरक्षित है कि यह सभी Xbox360 (अच्छी तरह से, शायद कुछ पाल खिलाड़ियों के लिए 50) पर 60fps पर चलने में सक्षम है। एक निश्चित टाइमस्टेप मानकर कोड को थोड़ा सा सरल बनाता है।

जब एक चर टाइमस्टेप - 'पॉस + = वेलोसिटी * टाइमस्टेप' द्वारा बहुत सी चीजों को स्केल करना आसान होता है, तो जब आप एक्सीलरेशन से निपट रहे होते हैं, और एक्सीलरेशन के बदलाव के रेट आदि को सही ढंग से करने में काफी मुश्किल हो जाती है।

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

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


1

स्पष्ट समाधान समानांतर में चलने वाले 2 छोरों का है - हर 1/60 के दूसरे और गेम के लूप को प्रति सेकंड 1/60 का प्रतिपादन।

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

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


2
मूल मांस लड़का एक फ़्लैश खेल था। सुपर मीट बॉय एक C ++ गेम है।
अर्चन

0

मैं अपने 2 डी पीसी खेल के लिए 60fps पर अब और खेलने के लिए कहने के लिए ज्यादा नहीं सोचता। यहां तक ​​कि अधिकांश 2D गेम्स अब त्वरित रूप से हार्डवेयर हैं इसलिए मुझे एफपीएस आवश्यकता के बारे में चिंता नहीं होगी।

असली सवाल यह है कि आप एक पिक्सेल आधारित का उपयोग क्यों नहीं करेंगे, खेल धोखा और शॉर्टकट से भरे हुए हैं।

यदि आप एक भौतिकी आधारित खेल बना रहे हैं (पक्षी शायद फेंक रहे हैं?) उत्तर स्पष्ट है, लेकिन एक सुपर मारियो क्लोन? समय आधारित आंदोलन थोड़ा बहुत हो सकता है।


उन्हें 60fps पर खेलना मुश्किल नहीं है, लेकिन 50Hz, 70-85Hz, और 120Hz की देशी ताज़ा दरों के साथ प्रदर्शित होते हैं।

0

2d भौतिकी में अजीब व्यवहार से बचने के लिए वे उपयोग कर रहे हैं?

ईमानदारी से मैं सिर्फ अनुमान लगा सकता हूं। मैं एक स्पष्टीकरण की कोशिश करूँगा:

खेल के दिल में मुख्य खेल पाश है। जो मूल रूप से इस तरह दिखता है:

while(gameRunning)
{
  updateGame(timestep);
  renderGame(timestep);
}

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

renderGame गेम को ड्रॉ और एनिमेट करता है।

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

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

एक भोली दृष्टिकोण होगा (जो मैं अपने खेल में उपयोग कर रहा हूं * आह *):

position=position+speed*timestep;
speed=speed+acceleration*timestep;

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

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

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