2010-05-08 12 views
5

एक्सएनए एक सतत और सटीक 60 एफपीएस फ्रेम दर कैसे बनाए रखता है? इसके अतिरिक्त, यह सीपीयू को 100% पर बिना छेड़छाड़ किए इस तरह के सटीक समय को कैसे बनाए रखता है?एक्सएनए समय काम कैसे करता है?

+1

मैं आमतौर पर जानना चाहूंगा कि नियमित समय की कोई चीज़ कैसे होती है। –

उत्तर

2

मुझे नहीं पता कि एक्सएनए कैसे करता है लेकिन कुछ साल पहले ओपनजीएल के साथ खेलते समय मैंने कुछ बहुत ही सरल कोड का उपयोग करके वही काम पूरा किया।

इसके मूल में मुझे लगता है कि एक्सएनए के पास कुछ प्रकार का प्रतिपादन लूप है, यह एक मानक भी प्रोसेसिंग लूप के साथ एकीकृत किया जा सकता है या नहीं, लेकिन उदाहरण के लिए मान लीजिए कि यह नहीं है। इस मामले में आप इसे इस तरह कुछ लिख सकते हैं।

TimeSpan FrameInterval = TimeSpan.FromMillis(1000.0/60.0); 
DateTime PrevFrameTime = DateTime.MinValue; 
while(true) 
{ 
    DateTime CurrentFrameTime = DateTime.Now; 
    TimeSpan diff = DateTime.Now - PrevFrameTime; 
    if(diff < FrameInterval) 
    { 
     DrawScene(); 
     PrevFrameTime = CurrentFrameTime; 
    } 
    else 
    { 
     Thread.Sleep(FrameInterval - diff); 
    } 
} 

हकीकत में आप शायद datetimes बजाय Environment.Ticks की तरह कुछ का प्रयोग करेंगे (यह ज्यादा सही होगा), लेकिन मुझे लगता है कि है कि इस बिंदु दिखाता है। इसे केवल ड्रॉसेन को दूसरी बार 60 बार कॉल करना चाहिए, और बाकी समय थ्रेड सो जाएगा, इसलिए इसमें कोई CPU समय नहीं लगेगा।

+0

लेकिन थ्रेड स्लीप का उपयोग करके, क्या यह थ्रेड शेड्यूलिंग पर निर्भर नहीं है? ऐसा लगता है कि सबसे अच्छा अनुमान लगाया जा सकता है। यही कारण है कि मुझे आश्चर्य हुआ कि वे कितने संगत हैं। – redman

+0

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

0

गेम 60fps पर चलना चाहिए लेकिन इसका मतलब यह नहीं है कि वे करेंगे। यह वास्तव में एक जारी खेल के लिए एक ऊपरी सीमा है।

यदि आप डीबग मोड में गेम चलाते हैं तो आपको प्रति सेकंड बहुत अधिक फ्रेम मिल सकते हैं - उदाहरण के लिए डीबग मोड में मेरे लैपटॉप पर एक खाली स्टार्टर टेम्पलेट 1,000fps से अधिक चलाता है।

कहा जा रहा है कि एक जारी गेम में एक्सएनए ढांचा 60fps पर चलाने के लिए सबसे अच्छा होगा - लेकिन आपके प्रोजेक्ट में आपके द्वारा शामिल कोड में उस प्रदर्शन को कम करने का मौका है। उदाहरण के लिए कुछ कचरा संग्रह को लगातार आग लगाना आपको आम तौर पर खेल के एफपीएस में डुबकी दिखाई देगा, या अद्यतन में कुछ जटिल गणित फेंक देगा या इस तरह के तरीकों को आकर्षित करेगा - इस प्रकार उन्हें हर फ्रेम में आग लगती है .. जो आमतौर पर थोड़ा अधिक होगा। अपने खेल को यथासंभव सुव्यवस्थित रखने के लिए ध्यान में रखने के लिए कई चीजें हैं।

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

+0

आप इस उत्तर में कुछ चीजों पर गलत हैं ... डीबग मोड अधिक ओवरहेड का कारण बनता है, कम नहीं। यह "मौका" नहीं है कि कोड प्रदर्शन धीमा कर देगा; यह हमेशा होगा। कचरा संग्रह हमेशा सीपीयू, अवधि को प्रभावित करता है। –

4

जबकि ल्यूक के कोड से ऊपर सैद्धांतिक सही इस्तेमाल किया तरीकों और गुण नहीं सबसे अच्छा विकल्प हैं:

  • DateTime.Now की शुद्धता ही है के बारे में 30ms (C# DateTime.Now precision देख सकते हैं और दे या ले 20ms) उच्च के लिए इसके उपयोग प्रदर्शन समय सलाह नहीं दी जाती है (60 एफपीएस 16 एमएमएस हैं)। System.Diagnostics.Stopwatchthe timer of choice for real time .NET
  • Thread.Sleep एक ही सटीक/संकल्प समस्या ग्रस्त है और निर्दिष्ट समय के लिए सोने के लिए गारंटी नहीं है है केवल

वर्तमान XNA FX विंडोज संदेश लूप में हुक और इसके आंतरिक पूर्व अद्यतन निष्पादित करने के लिए लगता है प्रत्येक चरण और Game.Update को कॉल करना केवल तभी अंतिम समय के बाद से निर्दिष्ट समय से निर्दिष्ट फ़्रेमेट (जैसे डिफ़ॉल्ट सेटिंग्स के लिए प्रत्येक 16ms) से मेल खाता है। यदि आप वास्तव में जानना चाहते हैं कि XNA FX नौकरी कैसे करता है Reflector आपका मित्र है :)

यादृच्छिक tidbit: वापस XNA GameStudio 1 में।0 अल्फा/बीटा समय सीमा में "बिल्कुल सही WinForms गेम लूप" के बारे में कुछ ब्लॉग पोस्ट थे, हालांकि मैं उन्हें अब खोजने में असफल रहा ...

0

आप इस बारे में सब कुछ पढ़ सकते हैं कि XNA टाइमर को कैसे लागू किया गया था Game timing in XNA Game Studio लेकिन मूल रूप से यह लूप को दोबारा जारी रखने से पहले एक सेकंड के 1/60 की कोशिश करेंगे और वाइट करेंगे, यह भी ध्यान दें कि XNA को "पकड़ने" की आवश्यकता होने पर अद्यतन को प्रस्तुत करने से पहले कई बार कहा जा सकता है।

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