如何使用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,对吧?(现在=最后,现在-最后。)
大卫

Answers:


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

注意:第一帧的deltatime始终为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 '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.