Як обчислити дельта-час із SDL?


11

Я чув, що ви можете обчислити час дельти за допомогою двох функцій, що називаються SDL_GetPerformanceCounter та SDL_GetPerformanceFrequency. Я не впевнений, як вони працюють повністю, але я чув, що це трохи схоже на використання 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**/
    }

У мене є цей код, але кожного разу, коли я роздруковую deltaTime або намагаюся його використовувати, він завжди дорівнює деяким дійсно випадковим і божевільним числам. Це правильно?


2
показаний код завжди встановлював би дельта-час у 0, правда? (ЗАРАЗ = ОСТАННІ, ЗАРАЗ - ОСТАННІ.)
David van Brink

Відповіді:


13

Читаючи приклад коду, наданий SDL на SDL_GetPerformanceFrequency, я міг легко дізнатися, як можна обчислити дельта-час за допомогою цих функцій.

По суті, це зводиться до вас:

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

Примітка: перший кадр завжди матиме проміжок часу 0 або щось дуже близьке до нього

Це має заповнити значення deltaTime в мілісекундах, це легко перетворити на секунди, помноживши кінцевий результат на 0,001.

Довідка: https://wiki.libsdl.org/SDL_GetPerformanceFrequency


6
Це було б більш точно: deltaTime = ((NOW - LAST)*1000 / (double)SDL_GetPerformanceFrequency() );оскільки це уникає затискання числа через ціле ділення.
Mortennobel

2

Таким чином, я пішов про обчислення часу дельти 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;
    }
};

Тоді я просто відмічаю Clockекземпляр у головному циклі.


Хоча цей підхід також працює, інша відповідь більш точна.
Tyyppi_77
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.