Как рассчитать время дельты с 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 или пытаюсь использовать его, он всегда равен некоторым действительно случайным и безумным числам. Это верно?

surafel911
источник
2
показанный код будет всегда устанавливать время дельта 0, верно? (СЕЙЧАС = ПОСЛЕДНИЕ, СЕЙЧАС - ПОСЛЕДНИЕ.)
Дэвид ван Бринк

Ответы:

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() );так как это позволит избежать зажима числа из-за целочисленного деления.
Мортеннобель
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экземпляр в основном цикле.

Salajouni
источник
Хотя этот подход работает, другой ответ является более точным.
Tyyppi_77