रास्ते में बहुत सारी आकर्षक चुनौतियों के साथ हम इस आम सम्मेलन में कैसे पहुंचे, इसका एक लंबा इतिहास है, इसलिए मैं चरणों में प्रेरित करने की कोशिश करूंगा:
1. समस्या: डिवाइस अलग-अलग गति से चलते हैं
कभी एक आधुनिक पीसी पर एक पुराना डॉस गेम खेलने की कोशिश करें, और यह अनपेक्षित रूप से तेज चलता है - बस एक धब्बा?
बहुत सारे पुराने खेलों में एक बहुत ही भोला-भाला अपडेट लूप था - वे इनपुट इकट्ठा करते थे, गेम स्टेट अपडेट करते थे, और हार्डवेयर जितनी जल्दी अनुमति देते थे, उतने समय के लिए लेखांकन के बिना कितना समय बीत जाता था। जिसका अर्थ है जैसे ही हार्डवेयर बदलता है, गेमप्ले बदल जाता है।
हम आम तौर पर चाहते हैं कि हमारे खिलाड़ी उपकरणों की एक श्रृंखला पर एक सुसंगत अनुभव और खेल महसूस करें, (जब तक वे कुछ न्यूनतम कल्पनाओं को पूरा करते हैं) चाहे वे पिछले साल के फोन या नवीनतम मॉडल का उपयोग कर रहे हों, एक टॉप-एंड गेमिंग डेस्कटॉप या एक मध्य स्तरीय लैपटॉप।
विशेष रूप से, उन खेलों के लिए जो प्रतिस्पर्धी हैं (या तो मल्टीप्लेयर या लीडरबोर्ड के माध्यम से) हम नहीं चाहते हैं कि खिलाड़ी किसी विशेष डिवाइस पर चल रहे हैं, ताकि दूसरों पर फायदा हो क्योंकि वे तेजी से दौड़ सकते हैं या प्रतिक्रिया देने के लिए अधिक समय दे सकते हैं।
यहाँ अचूक उपाय उस दर को लॉक करना है जिस पर हम गेमप्ले स्टेट अपडेट करते हैं। इस तरह हम नतीजों की गारंटी दे सकते हैं।
2. तो, क्यों न केवल फ्रैमरेट को लॉक किया जाए (जैसे। VSync का उपयोग करके) और फिर भी गेमप्ले स्टेट अपडेट और लॉकस्टेप में रेंडरिंग चलाएं?
यह काम कर सकता है, लेकिन दर्शकों के लिए हमेशा तालमेल नहीं है। एक लंबा समय था जब एक ठोस 30 एफपीएस पर चलने को खेलों के लिए सोने का मानक माना जाता था। अब, खिलाड़ी नियमित रूप से न्यूनतम बार के रूप में 60 एफपीएस की उम्मीद करते हैं, विशेष रूप से मल्टीप्लेयर एक्शन गेम्स में, और कुछ पुराने शीर्षक अब बिल्कुल चटक दिखते हैं क्योंकि हमारी उम्मीदें बदल गई हैं। पीसी के खिलाड़ियों का एक मुखर समूह भी है, जो विशेष रूप से तालों को बंद करने पर आपत्ति जताते हैं। उन्होंने अपने रक्तस्राव-धार हार्डवेयर के लिए बहुत अधिक भुगतान किया, और उस कंप्यूटिंग पेशी का उपयोग करने में सक्षम होना चाहते हैं जो सबसे अधिक, उच्चतम-निष्ठा प्रदान करने में सक्षम है।
वीआर में विशेष रूप से, फ्रैमरेट राजा है, और मानक ऊपर रेंगता रहता है। वीआर के हालिया पुनरुत्थान के शुरुआती दिनों में, खेल अक्सर 60 एफपीएस के आसपास चलता था। अब 90 अधिक मानक है, और PSVR की तरह हार्बर 120 का समर्थन करने लगा है। यह अभी भी बढ़ सकता है। इसलिए, यदि कोई वीआर गेम अपने फ्रैमरेट को आज क्या करने योग्य और स्वीकार्य मानता है, तो वह पीछे रह जाता है क्योंकि हार्डवेयर पीछे रह जाता है और अपेक्षाएं और विकसित होती हैं।
(एक नियम के रूप में, सावधान रहें जब बताया गया कि "XXX के मुकाबले खिलाड़ी तेजी से कुछ भी नहीं देख सकते हैं" क्योंकि यह आमतौर पर एक विशेष प्रकार की "धारणा" पर आधारित होता है, जैसे किसी फ्रेम को अनुक्रम में पहचानना। गति की निरंतरता की धारणा आम तौर पर कहीं अधिक है। संवेदनशील।)
यहां आखिरी मुद्दा यह है कि एक लॉक फ्रैमरेट का उपयोग करने वाले गेम को भी रूढ़िवादी होना चाहिए - यदि आप कभी भी उस गेम में एक क्षण हिट करते हैं जहां आप असामान्य रूप से उच्च संख्या में वस्तुओं को अपडेट और प्रदर्शित कर रहे हैं, तो आप अपने फ्रेम को याद नहीं करना चाहते हैं। समय सीमा और ध्यान देने योग्य हकलाना या अड़चन का कारण। इसलिए आपको या तो हेडरूम छोड़ने के लिए अपने कंटेंट बजट को काफी कम सेट करना होगा, या फिर मिन-स्पेक हार्डवेयर पर सबसे खराब स्थिति के प्रदर्शन के लिए पूरे प्ले एक्सपीरियंस को कम करने से बचने के लिए अधिक जटिल डायनामिक क्वालिटी एडजस्टमेंट फीचर्स में निवेश करना होगा।
यह विशेष रूप से समस्याग्रस्त हो सकता है यदि प्रदर्शन की समस्याएं विकास में देर से दिखाई देती हैं, जब आपके सभी मौजूदा सिस्टम निर्मित होते हैं और एक लॉकस्टेप रेंडरिंग फ्रैमर्ट मानकर देखते हैं कि अब आप हमेशा हिट नहीं कर सकते। अद्यतन और रेंडरिंग दर को कम करने से प्रदर्शन परिवर्तनशीलता से निपटने के लिए अधिक लचीलापन मिलता है।
3. एक निश्चित टाइमस्टेप पर अपडेट नहीं करने से क्या समस्याएँ होती हैं?
मुझे लगता है कि यह मूल प्रश्न का मांस है: अगर हम अपने अपडेट को कम कर देते हैं और कभी-कभी बीच में कोई गेम स्टेट अपडेट के साथ दो फ्रेम रेंडर करते हैं, तो क्या यह कम फ्रैमरेट में लॉकस्टेप रेंडरिंग के समान नहीं है, क्योंकि इसमें कोई दृश्य परिवर्तन नहीं है स्क्रीन?
वास्तव में कई अलग-अलग तरीके हैं जो गेम इन अद्यतनों को अच्छी तरह से प्रभावित करने के लिए उपयोग करते हैं:
a) अद्यतन दर प्रदान की गई फ्रैमरेट की तुलना में तेज़ हो सकती है
एक अन्य जवाब में tyjkenn के रूप में, विशेष रूप से भौतिकी अक्सर प्रतिपादन की तुलना में उच्च आवृत्ति पर कदम रखा जाता है, जो एकीकरण त्रुटियों को कम करने और अधिक सटीक टक्कर देने में मदद करता है। इसलिए, प्रदान किए गए फ़्रेमों के बीच 0 या 1 अपडेट होने के बजाय आपके पास 5 या 10 या 50 हो सकते हैं।
अब 120 एफपीएस पर रेंडर करने वाले खिलाड़ी को प्रति फ्रेम 2 अपडेट मिल सकते हैं, जबकि 30 एफपीएस पर कम स्पेक हार्डवेयर रेंडरिंग पर खिलाड़ी को प्रति फ्रेम 8 अपडेट मिलते हैं, और उनके दोनों गेम एक ही गेमप्ले-टिक-प्रति-रियलटाइम-सेकंड की गति से चलते हैं। बेहतर हार्डवेयर इसे सुचारू बनाता है, लेकिन गेमप्ले कैसे काम करता है, यह मौलिक रूप से नहीं बदलता है।
यहाँ एक जोखिम है कि, अगर अद्यतन दर को फ़्रैमरेट के लिए बेमेल कर दिया जाता है, तो आप दोनों के बीच "बीट फ़्रीक्वेंसी" प्राप्त कर सकते हैं । उदाहरण के लिए। अधिकांश फ़्रेम में हमारे पास 4 गेम स्टेट अपडेट और थोड़ा बचे हुए समय के लिए पर्याप्त समय है, तो हर बार अक्सर हमने एक फ्रेम में 5 अपडेट करने के लिए पर्याप्त बचत की है, जिससे आंदोलन में थोड़ा उछाल या हकलाना होता है। इसके द्वारा पता किया जा सकता है ...
ख) इंटरपोलेटिंग (या एक्सट्रपॉलेटिंग) अपडेट के बीच गेम स्टेट
यहां हम अक्सर खेल राज्य को भविष्य में एक निश्चित टाइमस्टेप जीने देंगे, और 2 सबसे हाल के राज्यों से पर्याप्त जानकारी संग्रहीत करेंगे कि हम उनके बीच एक मनमाना बिंदु प्रस्तुत कर सकें। फिर जब हम ऑन-स्क्रीन एक नया फ्रेम दिखाने के लिए तैयार होते हैं, तो हम केवल प्रदर्शन के उद्देश्यों के लिए उपयुक्त क्षण के लिए मिश्रण करते हैं (यानी। हम यहां अंतर्निहित गेमप्ले राज्य को संशोधित नहीं करते हैं)।
जब यह सही किया जाता है, तो आंदोलन को चिकना महसूस होता है, और यहां तक कि फ्रैमरेट में कुछ उतार-चढ़ाव को मुखौटा करने में मदद करता है, जब तक कि हम बहुत कम नहीं छोड़ते हैं ।
ग) गैर-गेमप्ले-राज्य परिवर्तनों में चिकनाई जोड़ना
गेमप्ले स्टेट को इंटरपोल किए बिना भी हम कुछ स्मूथनेस जीत सकते हैं।
चरित्र एनीमेशन, कण प्रणाली या वीएफएक्स जैसे विशुद्ध रूप से दृश्य परिवर्तन और एचयूडी जैसे उपयोगकर्ता इंटरफ़ेस तत्व, अक्सर गेमप्ले राज्य के निश्चित टाइमस्टेप से अलग से अपडेट होते हैं। इसका मतलब है कि यदि हम प्रति फ्रेमवर्क में हमारे गेमप्ले को कई बार टिक कर रहे हैं, तो हम हर टिक के साथ उनकी लागत का भुगतान नहीं कर रहे हैं - केवल अंतिम रेंडर पास पर। इसके बजाय, हम फ्रेम की लंबाई से मेल खाने के लिए इन प्रभावों की प्लेबैक गति को मापते हैं, इसलिए वे गेम की गति या निष्पक्षता को प्रभावित किए बिना रेंडरिंग फ्रैमरेट के रूप में आसानी से खेलते हैं (1) में चर्चा की गई है।
कैमरा आंदोलन ऐसा भी कर सकता है - विशेष रूप से वीआर में, हम कभी-कभी एक ही फ्रेम को एक से अधिक बार दिखाएंगे, लेकिन बीच-बीच में खिलाड़ी के सिर की गति को ध्यान में रखते हुए इसे अस्वीकार कर सकते हैं, इसलिए हम कथित विलंबता और आराम को बेहतर कर सकते हैं, भले ही हम कर सकें टी मूल रूप से सब कुछ है कि तेजी से प्रस्तुत करना। कुछ गेम स्ट्रीमिंग सिस्टम (जहां सर्वर पर गेम चल रहा है और खिलाड़ी केवल एक पतला ग्राहक चलाता है) इसका एक संस्करण भी उपयोग करते हैं।
4. हर चीज़ के लिए सिर्फ (c) स्टाइल का उपयोग क्यों नहीं किया जाता है? यदि यह एनीमेशन और UI के लिए काम करता है, तो क्या हम वर्तमान गेमरेट को मैच करने के लिए अपने गेमप्ले स्टेट अपडेट को सरलता से माप नहीं सकते हैं?
हां * यह संभव है, लेकिन नहीं यह सरल नहीं है।
यह उत्तर पहले से ही लंबा है इसलिए मैं सभी विवरणों में नहीं जाऊंगा, बस एक त्वरित सारांश:
रैखिक परिवर्तन के deltaTime
लिए परिवर्तनशील-लंबाई अपडेट को समायोजित करने के लिए कार्यों द्वारा गुणा (उदाहरण के लिए निरंतर वेग के साथ आंदोलन, एक टाइमर की उलटी गिनती, या एक एनीमेशन समयरेखा के साथ प्रगति)
दुर्भाग्य से, खेल के कई पहलू गैर-रैखिक हैं । यहां तक कि कुछ भी जितना सरल होता है, गुरुत्वाकर्षण अलग-अलग फ्रैमरेट्स के तहत परिणाम बदलने से बचने के लिए अधिक परिष्कृत एकीकरण तकनीक या उच्च-रिज़ॉल्यूशन के विकल्प की मांग करता है। खिलाड़ी इनपुट और नियंत्रण अपने आप में गैर-रैखिकता का एक बड़ा स्रोत है।
विशेष रूप से, असतत टकराव का पता लगाने और रिज़ॉल्यूशन अपडेट दर पर निर्भर करते हैं, अगर फ्रेम बहुत लंबा है तो टनलिंग और जिटरिंग त्रुटियों के लिए अग्रणी है। तो एक चर framerate हमें हमारी सामग्री पर अधिक जटिल / महंगी निरंतर टकराव का पता लगाने के तरीकों का उपयोग करने या हमारी भौतिकी में परिवर्तनशीलता को सहन करने के लिए मजबूर करता है। यहां तक कि निरंतर टकराव का पता लगाने की चुनौती तब होती है जब ऑब्जेक्ट आर्क्स में चले जाते हैं, जिन्हें छोटे टाइमस्टेप की आवश्यकता होती है ...
इसलिए, मध्यम जटिलता के खेल के लिए सामान्य मामले में, deltaTime
स्केलिंग के माध्यम से पूरी तरह से निरंतर व्यवहार और निष्पक्षता बनाए रखना कहीं न कहीं बहुत मुश्किल और रखरखाव के लिए एकमुश्त संक्रामक है।
अद्यतन दर को मानकीकृत करने से हम कई परिस्थितियों में अधिक सरल व्यवहार की गारंटी देते हैं , अक्सर सरल कोड के साथ।
रेंडरिंग से डिकोड किए गए उस अपडेट रेट को रखने से हमें गेमप्ले लॉजिक में बदलाव किए बिना अनुभव की चिकनाई और प्रदर्शन को नियंत्रित करने की सुविधा मिलती है ।
फिर भी हमें कभी भी "पूर्ण" भयावह स्वतंत्रता नहीं मिलती है, लेकिन खेलों में इतने सारे दृष्टिकोणों की तरह यह हमें किसी दिए गए खेल की जरूरतों के लिए "अच्छा पर्याप्त" की ओर डायल करने के लिए एक नियंत्रणीय विधि प्रदान करता है। इसलिए इसे आमतौर पर एक उपयोगी शुरुआती बिंदु के रूप में पढ़ाया जाता है।