फ्रैमरेट सीमा


9

सबसे सफल प्रतियोगी खेल इंजन की तरह id Tech, GoldSrc, Sourceऔर इस तरह के फ़्रेमरेट सीमाओं के लिए अनुमति देते हैं।

आप 30 के साथ खेल सकते हैं, 60 के साथ, 99 के साथ, 72 के साथ, 68 के साथ आदि। संक्षेप में, आप इसे कैप कर सकते हैं और कैप को नियंत्रित कर सकते हैं।

मैं सोच रहा था, मैं फ्रैमरेट को कैसे सीमित करूं?

कोड में दिलचस्पी नहीं है, लेकिन सिद्धांत।


बस जिज्ञासा से बाहर, अन्य प्रक्रियाओं के लिए साइकिल को मुक्त करने के अलावा इस में और क्या बात है?
डी

1
@DavidLively, लैपटॉप के बारे में सोचें, वे बहुत आसानी से एक बहुत ही उच्च फ्रेम दर पर ओवरहीट करते हैं, जबकि 60fps की कैप के साथ (वैसे भी बेकार है, यहां तक ​​कि 60 थोड़ा ज्यादा है, 40 करना चाहिए) वे तापमान को बेहतर तरीके से नियंत्रित कर सकते हैं।

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

जवाबों:


7

सिद्धांत यह है: जब आपने आखिरी बार एक फ्रेम प्रदान किया है, तो जांचें और यदि यह अभी तक किसी अन्य फ्रेम को खींचने का समय नहीं है, तो ऐसा न करें, और तब तक प्रतीक्षा करें।


8

मान लें कि आप अपने फ़्रेम को 60fps तक सीमित करना चाहते हैं, इसका मतलब है कि हर फ्रेम में 1 / 60s = 16,67ms (राउंडेड) का रेंडर समय है

अपनी फ्रेम दर को सीमित करने के लिए आप अपने गेम लूप की शुरुआत में समय की जांच करें, आप गेम लूप के अंत में समय के साथ इसकी तुलना कर सकते हैं: यदि अंतर 16.67ms से कम है तो आपको उस समय के लिए स्टाल करना चाहिए।

इसका उपयोग करने का एक तरीका यह है:

sleep(waittime)

हालाँकि जब से आप sleep(x)कम से कम xसमय में नियंत्रण प्राप्त कर लेंगे, तो आप कम से कम मील के धागे के लिए पैदावार नहीं लेंगे।

उपयोग करने का एक बेहतर तरीका होगा:

while(timediff < 16.67ms){ sleep(0); }

इससे धागे की पैदावार होती है और अनुरोध जल्द से जल्द वापस नियंत्रित हो जाता है।

एक और उपाय बस एक व्यस्त लूप है, यह आपको सबसे अच्छा नियंत्रण देता है, लेकिन सीपीयू का अनावश्यक रूप से उपयोग करता है।

याद रखें कि ओएस अनुसूचक हमेशा आपके धागे से नियंत्रण हटा सकता है इसलिए कुछ उतार-चढ़ाव के लिए तैयार रहें।


स्पष्ट होने के लिए "1 / 60s"। :)
रिचर्ड मार्स्केल - Drackir

यह समाधान वास्तव में बुरा है। यदि आपने vsync को सक्षम किया है या OS सामान करने का निर्णय लेता है, तो आपका फ्रैमरेट बहुत अधिक उतार-चढ़ाव करेगा।
तारा

@Dudeson यह बुरा क्यों है? (यह Quake3 btw में प्रयुक्त तकनीक है)। यदि आपका एफपीएस 60 से कम है, तो लूप बस छूट जाता है। इसलिए यह आपके FPS को जितना संभव हो सके, लेकिन 60 से ऊपर कभी नहीं रखता है।
रॉय टी।

@RoyT। दिलचस्प ... आपको वह जानकारी कहां से मिली? स्रोत कोड से? इसके अलावा, मैं कह रहा हूं कि एक लूप में इंतजार करना बुरा है क्योंकि ठीक यही है कि मैंने इसे अपने इंजन में कैसे किया और इससे मुझे बहुत दर्द होता है। समस्या यह है, जब आप vsync (GPU ड्राइवर में) को चालू करते हैं, तो आपको बहुत सारे फ़्रेम ड्रॉप मिलते हैं यदि आप अतिरिक्त रूप से अपने कोड में फ़्रेम दर को सीमित करने का प्रयास करते हैं, क्योंकि आपका टाइमइनिग हर फ्रेम सही नहीं होगा। मैं सिर्फ vsync मुद्दों के बारे में बात कर रहा हूँ। Vsync के बिना यह कोई समस्या नहीं है। और मुझे यकीन नहीं है कि अगर vsync क्वेक 3 दिनों में उसी तरह का सौदा था जैसा कि आज है।
तारा

@Dudeson किसी और ने बताया कि कुछ समय पहले मेरे लिए बाहर क्योंकि मैं व्यस्त प्रतीक्षा और नींद के बारे में चिंतित था। अब मैं देख रहा हूं कि जब आप थोड़ा चूक जाते हैं तो v-सिंक चालू होने पर आप 30fps और 60fps के बीच उतार-चढ़ाव कर सकते हैं। लेकिन मुझे लगता है कि किसी भी तकनीक के साथ ऐसा होता है (यह नहीं है कि FreeSync कम करने की कोशिश करता है)। कोड द्वारा एक सीमित फ्रैमर्ट, या क्योंकि आपका कंप्यूटर 60fps पर प्रस्तुत नहीं कर सकता है, मुझे हमेशा यह समस्या होगी :)
रॉय टी।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.