एसडीएल के साथ डेल्टा समय की गणना कैसे करें?


11

मैंने सुना है कि आप SDL_GetPerformanceCounter और SDL_GetPerformanceFrequency नामक दो कार्यों के साथ डेल्टा समय की गणना कर सकते हैं। मुझे यकीन नहीं है कि वे पूरी तरह से कैसे काम करते हैं, लेकिन मैंने सुना है कि यह SDL_GetTicks () का उपयोग करने के समान है

    Uint64 NOW, LAST;
    double deltaTime = 0;

    while (somebool)
    {
       LAST = SDL_GetPerformanceCounter();
       NOW = SDL_GetPerformanceCounter();
       LAST = NOW;

       deltaTime = (NOW - LAST) / (double)SDL_GetPerformanceFrequency();

       /**Rendering**/
    }

मेरे पास यह कोड है, लेकिन जब भी मैं डेल्टा प्रिंट आउट लेता हूं या इसका उपयोग करने की कोशिश करता हूं तो यह हमेशा कुछ यादृच्छिक और पागल संख्याओं के बराबर होता है। क्या ये सही है?


2
दिखाया गया कोड हमेशा डेल्टा समय को 0 पर सेट करेगा, है ना? (नाऊ = लास्ट, नाउ - लास्ट।)
वैन में

जवाबों:


13

SDL_GetPerformanceFrequency पर SDL द्वारा प्रदान किए गए कोड-उदाहरण को पढ़ते हुए मैं आसानी से पता लगा सकता था कि आप इन कार्यों का उपयोग करके एक डेल्टाइम की गणना कैसे कर सकते हैं।

मूल रूप से यह आपके लिए नीचे आना चाहिए:

Uint64 NOW = SDL_GetPerformanceCounter();
Uint64 LAST = 0;
double deltaTime = 0;

while (somebool)
{
   LAST = NOW;
   NOW = SDL_GetPerformanceCounter();

   deltaTime = (double)((NOW - LAST)*1000 / (double)SDL_GetPerformanceFrequency() );

   /**Rendering**/
}

नोट: पहले फ्रेम में हमेशा 0 या कुछ के करीब एक बहुत कुछ होता है

यह मिलीसेकंड में मूल्य डेल्टा को भरना चाहिए, यह आसानी से 0.001 के साथ अंतिम परिणाम को गुणा करके सेकंड में परिवर्तित किया जा सकता है।

संदर्भ: https://wiki.libsdl.org/SDL_GetPerformanceFrequency


6
यह अधिक सटीक होगा: deltaTime = ((NOW - LAST)*1000 / (double)SDL_GetPerformanceFrequency() );क्योंकि यह पूर्णांक विभाजन के कारण संख्या को क्लैंप करने से बचता है।
मोर्टेनोबेल

2

वे जिस तरह से मैं डेल्टा समय की गणना के बारे में गया है के माध्यम से किया गया है SDL_GetTicks():

struct Clock
{
    uint32_t last_tick_time = 0;
    uint32_t delta = 0;

    void tick()
    {
        uint32_t tick_time = SDL_GetTicks();
        delta = tick_time - last_tick_time;
        last_tick_time = tick_time;
    }
};

फिर मैं Clockमुख्य लूप में एक उदाहरण देता हूं ।


जबकि यह दृष्टिकोण भी काम करता है, अन्य उत्तर अधिक सटीक है।
तैय्यप_
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.