Comment calculer le temps delta avec SDL?

11

J'ai entendu dire que vous pouvez calculer le temps delta avec deux fonctions appelées SDL_GetPerformanceCounter et SDL_GetPerformanceFrequency. Je ne sais pas comment ils fonctionnent complètement, mais j'ai entendu dire que c'était un peu similaire à l'utilisation 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**/
    }

J'ai ce code mais chaque fois que j'imprime deltaTime ou essaie de l'utiliser, il équivaut toujours à des nombres vraiment aléatoires et insensés. Est-ce correct?

surafel911
la source
2
le code affiché définirait toujours le temps delta à 0, non? (MAINTENANT = DERNIER, MAINTENANT - DERNIER.)
David Van

Réponses:

13

En lisant l'exemple de code fourni par SDL sur SDL_GetPerformanceFrequency, j'ai pu facilement découvrir comment calculer un deltatime à l'aide de ces fonctions.

Cela devrait se résumer à ceci pour vous:

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

Remarque: la première image aura toujours un deltatime de 0 ou quelque chose de très proche

Cela devrait remplir la valeur deltaTime en millisecondes, cela peut facilement être converti en secondes en multipliant le résultat final par 0,001.

Référence: https://wiki.libsdl.org/SDL_GetPerformanceFrequency

Patrick le Duc
la source
6
Ce serait plus précis: deltaTime = ((NOW - LAST)*1000 / (double)SDL_GetPerformanceFrequency() );car cela évite de bloquer le nombre en raison de la division entière.
Mortennobel
2

Leur façon de calculer le temps delta a été via 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;
    }
};

Ensuite, je coche simplement une Clockinstance dans la boucle principale.

Salajouni
la source
Bien que cette approche fonctionne également, l'autre réponse est plus précise.
Tyyppi_77