2010-06-23 10 views
10

मैं एक गेम लिख रहा हूं, और मैंने देखा कि एफपीएस एल्गोरिदम सही तरीके से काम नहीं करता है (जब उसे और अधिक गणना करनी पड़ती है, वह अब सोता है ...) तो सवाल बहुत आसान है: होने के लिए सपने की गणना कैसे करें सही एफपीएस?खेल विकास: एफपीएस कैसे सीमित करें?

मुझे पता है कि गेम को माइक्रोसॉन्ड में एक फ्रेम को अपडेट करने में कितना समय लगेगा और निश्चित रूप से एफपीएस मैं पहुंचना चाहता हूं।

मैं एक साधारण उदाहरण के लिए पागल हो खोज रहा हूँ, लेकिन मैं नहीं मिल सकता है एक ....

कोड जावा, सी ++ या छद्म में हो सकता है ....

+12

आम तौर पर आप अपने एफपीएस को सीमित नहीं करना चाहते हैं। अगर कोई बेहद अच्छा ग्राफिक्स कार्ड का भुगतान करता है, तो वे अधिक एफपीएस चाहते हैं। आपको अपना कोड डिज़ाइन करना चाहिए ताकि यह फ्रेम के बीच का समय माप सके (या यहां तक ​​कि कुछ मनमानी "टिक" फ़्रेमेट से स्वतंत्र) पर काम करता है और उसके बाद गेम ऑब्जेक्ट्स को उस समय के आधार पर अद्यतन करने का कारण बनता है। यदि आप यह सही करते हैं, तो आपका गेम 15fps या 100fps पर उसी तरह से खेलेंगे, जिसमें गति की चिकनीता केवल अंतर है। – rmeador

+2

@ रेमेडोर: मॉनिटर की रीफ्रेश दर से तेज़ी से जाने में थोड़ा सा बिंदु है, जो आमतौर पर टीएफटी मॉनीटर पर 60 हर्ट्ज होता है (लेकिन यह निश्चित रूप से निर्भर नहीं होना चाहिए)। – Thomas

+1

@ रेमेडोर: लेकिन वह सभी सीपीयू खाएगा ... –

उत्तर

13

प्रति फ्रेम माइक्रोसेकंड की संख्या 1000000/frames_per_second है। यदि आप जानते हैं कि आप खर्च किया है elapsed_microseconds गणना, तो समय है कि आप आराम की ज़रूरत होती है:

(1000000/frames_per_second) - elapsed_microseconds 
+0

@ जेएस बैंग्स: हम्म ... वही प्रभाव ... मैं समय फ्यूक्शन की जांच करने जा रहा हूँ। –

+0

@ जेएस बैंग्स: वास्तव में, यह मेरे समय के काम थे .... धन्यवाद –

14

बार जब आप एक फ्रेम प्रतिपादन पर खर्च करना चाहिए 1/FPS सेकेंड (यदि आप लक्ष्य कर रहे हैं, तो 10 एफपीएस कहें, आपको प्रत्येक फ्रेम पर 1/10 = 0.1 सेकंड खर्च करना चाहिए)। तो अगर इसे X सेकंड प्रस्तुत करने के लिए लिया गया है, तो आपको 1/FPS - X सेकंड के लिए "सो" चाहिए।

का अनुवाद करना कि उदाहरण मिलीसेकंड के लिए करने के लिए, आप

ms_to_sleep = 1000/FPS - elapsed_ms; 

यह किसी कारण से भी अधिक 1/FPS ले लिया तो फ्रेम रेंडर करने के लिए, आप में जो मामले आपको स्पष्ट रूप से बस को छोड़ एक नकारात्मक सोने का समय मिल जाएगा मिलता है सो रहा है

2

का प्रयास करें ...

static const int NUM_FPS_SAMPLES = 64; 
float fpsSamples[NUM_FPS_SAMPLES] 
int currentSample = 0; 

float CalcFPS(int dt) 
{ 
    fpsSamples[currentSample % NUM_FPS_SAMPLES] = 1.0f/dt; 
    float fps = 0; 
    for (int i = 0; i < NUM_FPS_SAMPLES; i++) 
     fps += fpsSamples[i]; 
    fps /= NUM_FPS_SAMPLES; 
    return fps; 
} 

... के रूप में प्रति http://www.gamedev.net/community/forums/topic.asp?topic_id=510019

1

लें विभिन्न एफपीएस हैंडलिंग विधियों के बारे में this आलेख पर एक नज़र।

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