2011-04-01 19 views
13

मैं ग्राफिक्स के लिए नया हूं, इसलिए मुझे नहीं पता कि लोग आमतौर पर चीजों को प्रस्तुत करने के लिए फ्रेम दर को कैसे नियंत्रित करते हैं। मेरा मतलब है, आप 30fps कहने के लिए आवेदन कैसे सेट कर सकते हैं? शायद ऐसी कई एपीआई हैं जो ऐसी चीज प्रदान करती हैं, लेकिन मुझे इसे स्क्रैच से कोड करने की आवश्यकता है।फ्रेम दर को नियंत्रित करने का सामान्य तरीका क्या है?

+0

संभावित डुप्लिकेट: http://stackoverflow.com/questions/2940054/how-to-determine-the-best-framerate-setinterval-delay-to-use-in-a-javascript – INS

उत्तर

20

फ़्रेमेट "नियंत्रण" के दो "सामान्य" तरीके हैं, और न ही यह काफी सरल है।

दोनों की पहली और अधिक नियंत्रण, और आमतौर पर वैकल्पिक जो कुछ है, VSync है। मॉनीटर रीफ्रेशिंग होने पर यह वीडियो कार्ड को केवल नए फ्रेम को धक्का देने के लिए मजबूर करता है। कई मॉनीटर 60 हर्ट्ज पर रीफ्रेश करते हैं, इसलिए आपको 60 एफपीएस मिलते हैं।

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

(DirectX और OpenGL में vsync के बारे में जानकारी का एक सा)

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

while (gameloop) 
{ 
    float framedelta = (timeNow - timeLast) 
    timeLast = timeNow; 

    for each (GameObject object in World) 
    { 
     object->Animate(framedelta); 
     object->Move(speed * framedelta) 
    } 

    render(); 
} 

आप समय अंतर/समय वहाँ से पारित कर दिया/डेल्टा, और काम को देखने के लिए चाहते हैं:

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

+1

30 आने के बाद 20;) – fredoverflow

6

अनुमानित (यदि स्थिर नहीं है) फ्रेम दर (वीडियो या 3 डी ग्राफिक्स के साथ) को निम्नलिखित छद्म कोड में वर्णित करने का सामान्य तरीका है।

एल्गोरिथ्म

  1. अगले फ्रेम (बैक-बफर में प्रस्तुत करना) तैयार करें;
  2. शेष समय स्लाइस के लिए सो जाओ;
  3. फ्रेम को प्रदर्शित करने के लिए कहें (फ्रंट और बैक बफर स्वैप करें)।

नींद ऑपरेशन की स्थिति पर ध्यान दें। यह एक ही फ्रेम की तैयारी और प्रदर्शन के बीच सैंडविच है। स्थिर फ्रेम दर के लिए यह मुख्य कुंजी है! आप फ्रेम फ्रेम प्रदर्शित करने के लिए कुल समय स्लाइस में फ्रेम की तैयारी करना चाहते हैं।

इन चरणों में से प्रत्येक को लागू करने के तरीके पर कई प्रकार हैं (नींद ऑपरेशन की पसंद इसके संकल्प, विश्वसनीयता, इत्यादि के आधार पर), लेकिन मूल वहां है।

अतिरिक्त विश्वसनीयता

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

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

संबंधित मुद्दे