Como calcular o tempo delta com SDL?

11

Ouvi dizer que você pode calcular o tempo delta com duas funções chamadas SDL_GetPerformanceCounter e SDL_GetPerformanceFrequency. Não tenho certeza de como eles funcionam completamente, mas ouvi dizer que é um pouco semelhante ao 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**/
    }

Eu tenho esse código, mas sempre que imprimo o deltaTime ou tento usá-lo, sempre é igual a alguns números realmente aleatórios e insanos. Isso está correto?

surafel911
fonte
2
o código mostrado sempre definiria o tempo delta para 0, certo? (NOW = último, AGORA - ÚLTIMA.)
david van brink

Respostas:

13

Ao ler o exemplo de código fornecido pelo SDL no SDL_GetPerformanceFrequency, pude descobrir com facilidade como você pode calcular um tempo de delta usando essas funções.

Basicamente, tudo se resume a isso para você:

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: o primeiro quadro sempre terá um tempo de delt de 0 ou algo muito próximo a ele

Isso deve preencher o valor deltaTime em milissegundos. Isso pode ser facilmente convertido em segundos, multiplicando o resultado final por 0,001.

Referência: https://wiki.libsdl.org/SDL_GetPerformanceFrequency

Patrick le Duc
fonte
6
Isso seria mais preciso: deltaTime = ((NOW - LAST)*1000 / (double)SDL_GetPerformanceFrequency() );uma vez que isso evita fixar o número devido à divisão inteira.
Mortennobel 20/09/16
2

Do jeito que eu calculei o tempo de delta, foi atravé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;
    }
};

Simplesmente marque uma Clockinstância no loop principal.

Salajouni
fonte
Embora essa abordagem também funcione, a outra resposta é mais precisa.
Tyyppi_77