¿Cómo calcular el tiempo delta con SDL?

11

He oído que puede calcular el tiempo delta con dos funciones llamadas SDL_GetPerformanceCounter y SDL_GetPerformanceFrequency. No estoy seguro de cómo funcionan por completo, pero escuché que es un poco similar al uso de 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**/
    }

Tengo este código, pero cada vez que imprimo deltaTime o intento usarlo, siempre es igual a algunos números realmente aleatorios y locos. ¿Es esto correcto?

surafel911
fuente
2
el código mostrado siempre establecería el tiempo delta en 0, ¿verdad? (AHORA = ÚLTIMO, AHORA - ÚLTIMO)
david van brink el

Respuestas:

13

Al leer el ejemplo de código proporcionado por SDL en SDL_GetPerformanceFrequency, podría descubrir fácilmente cómo puede calcular un tiempo delta utilizando estas funciones.

Básicamente debería ser todo para ti:

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: el primer cuadro siempre tendrá un tiempo delta de 0 o algo muy cercano

Esto debería llenar el valor deltaTime en milisegundos, esto se puede convertir fácilmente a segundos multiplicando el resultado final con 0.001.

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

Patrick le Duc
fuente
66
Esto sería más exacto: deltaTime = ((NOW - LAST)*1000 / (double)SDL_GetPerformanceFrequency() );ya que esto evita sujetar el número debido a la división entera.
Mortennobel
2

La forma en que me he dedicado a calcular el tiempo delta ha sido a través de 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;
    }
};

Luego, simplemente marco una Clockinstancia en el bucle principal.

Salajouni
fuente
Si bien este enfoque también funciona, la otra respuesta es más precisa.
Tyyppi_77