Come calcolare il delta time con SDL?


11

Ho sentito che puoi calcolare il delta time con due funzioni chiamate SDL_GetPerformanceCounter e SDL_GetPerformanceFrequency. Non sono sicuro di come funzionano completamente, ma ho sentito che è un po 'simile all'utilizzo di 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**/
    }

Ho questo codice ma ogni volta che stampo deltaTime o provo ad usarlo è sempre uguale a numeri davvero casuali e folli. È corretto?


2
il codice visualizzato imposterà sempre il delta time su 0, giusto? (ORA = ULTIMO, ORA - ULTIMO.)
David Van Brink,

Risposte:


13

Leggendo l'esempio di codice fornito da SDL su SDL_GetPerformanceFrequency ho potuto facilmente scoprire come calcolare un deltatime usando queste funzioni.

Fondamentalmente dovrebbe scendere a questo per te:

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**/
}

Nota: il primo fotogramma avrà sempre un deltatime di 0 o qualcosa di molto vicino ad esso

Questo dovrebbe riempire il valore deltaTime in millisecondi, questo può essere facilmente convertito in secondi moltiplicando il risultato finale con 0,001.

Riferimento: https://wiki.libsdl.org/SDL_GetPerformanceFrequency


6
Ciò sarebbe più preciso: deltaTime = ((NOW - LAST)*1000 / (double)SDL_GetPerformanceFrequency() );poiché questo eviterebbe di bloccare il numero a causa della divisione dei numeri interi.
Mortennobel,

2

Il modo in cui ho fatto il calcolo del tempo delta è stato tramite 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;
    }
};

Quindi spunta semplicemente Clockun'istanza nel ciclo principale.


Sebbene anche questo approccio funzioni, l'altra risposta è più precisa.
Tyyppi_77,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.