Wie berechnet man die Deltazeit mit SDL?

11

Ich habe gehört, dass Sie die Deltazeit mit zwei Funktionen berechnen können, die als SDL_GetPerformanceCounter und SDL_GetPerformanceFrequency bezeichnet werden. Ich bin nicht sicher, wie sie vollständig funktionieren, aber ich habe gehört, dass es ein bisschen ähnlich ist wie die Verwendung von 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**/
    }

Ich habe diesen Code, aber wenn ich deltaTime drucke oder versuche, ihn zu verwenden, entspricht er immer einigen wirklich zufälligen und verrückten Zahlen. Ist das richtig?

surafel911
quelle
2
Der angezeigte Code würde die Delta-Zeit immer auf 0 setzen, oder? (JETZT = LETZT, JETZT - LETZT.)
David Van Brink

Antworten:

13

Beim Lesen des von SDL bereitgestellten Codebeispiels in SDL_GetPerformanceFrequency konnte ich leicht herausfinden, wie Sie mit diesen Funktionen eine Deltatime berechnen können.

Grundsätzlich sollte es für Sie darauf ankommen:

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

Hinweis: Der erste Frame hat immer eine Deltatime von 0 oder etwas sehr Nahes

Dies sollte den Wert deltaTime in Millisekunden füllen. Dies kann leicht in Sekunden umgewandelt werden, indem das Endergebnis mit 0,001 multipliziert wird.

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

Patrick le Duc
quelle
6
Dies wäre genauer: deltaTime = ((NOW - LAST)*1000 / (double)SDL_GetPerformanceFrequency() );da dies ein Klemmen der Zahl aufgrund der Ganzzahldivision vermeidet.
Mortennobel
2

Die Art und Weise, wie ich die Deltazeit berechnet habe, war über 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;
    }
};

Dann kreuze ich einfach eine ClockInstanz in der Hauptschleife an.

Salajouni
quelle
Während dieser Ansatz auch funktioniert, ist die andere Antwort präziser.
Tyyppi_77