【问题标题】:SDL_Delay affects SDL_GetTicksSDL_Delay 影响 SDL_GetTicks
【发布时间】:2014-08-20 15:49:18
【问题描述】:

我正在尝试将 SDL 程序限制为 60 FPS 并使用以下代码计算 FPS:

static const Uint32 min_frame_time = 16;
Uint32 start_time = SDL_GetTicks();

// Rendering stuff...

time_delta = SDL_GetTicks() - start_time;
fps_sum += 1000.0 / (float)time_delta;
fps_count++;

if(fps_count >= fps_max_count)
{
    printf("FPS: %f\n", fps_sum / (float)fps_count);
    fps_count = 0;
    fps_sum = 0.0;
}

if(time_delta < min_frame_time)
    SDL_Delay(min_frame_time - time_delta);

但似乎 SDL_Delay 以某种方式影响了 SDL_GetTicks 的返回值,因此 time_delta 得到的值是 0 到 3,而当我只删除最后 2 行时,它通常约为 15。

对我来说,这毫无意义。有谁知道怎么回事?

编辑:

上面的代码基本上是我程序的主循环。我首先实现了一个 fps 计数器,方法是在 start_time 中渲染场景之前节省时间,然后计算多个循环的平均 fps,效果很好。

然后,我添加了最后两行以将 fps 限制为 60。因此,如果渲染速度比 min_frame_time 快,则程序应该等待其余时间。但是加上这个之后,除了第一个循环之外,所有循环的SDL_GetTicks()的结果都变得奇怪了,所以delta变成了我上面提到的这些小值。

【问题讨论】:

  • 我不明白你的问题。您能否对其进行编辑并详细说明您在有没有延迟的情况下看到的内容。另外,是在循环之间吗?

标签: c++ time sdl delay frame-rate


【解决方案1】:

根据您所展示的内容,在这里稍微猜测一下。

在启用垂直同步的情况下运行窗口或全屏时,SDL_RenderPresent 将等待垂直同步。此等待将发生在您的定时代码中,因此您会看到 time_delta = 15 附近的值。使用SDL_Delay,您将手动等待,直到接近或刚好在下一次垂直同步之后,但这种等待超出了您的时间。因此,下一次渲染时,它不必等待,或者不必等待很长时间,下一次 vsync 就会发生,并且您可以更快地运行渲染循环。

【讨论】:

  • 谢谢你的回答,但这里不是这样。我只使用 OpenGL 绘制所有内容,它不会自动等待 VSync。通过禁用一些阴影贴图,我可以获得超过 60 的 FPS。
  • @FlorianM 好的,不是这样。我会把答案留在这里给其他人看(谁知道呢,这可能对某人有帮助)。
【解决方案2】:

某些程序,例如 Google Chrome。将 SystemclockResolution 设置为 15ms。 有办法解决这个问题。

Sleep(1) and SDL_Delay(1) takes 15 ms

但如果我理解正确的话,它会减慢 CPU 每 1 毫秒滴答一次。 我希望这可以帮助你,我一直在寻找这方面的信息!

我认为我不应该搞砸这个,也许只是解决它。

【讨论】:

    猜你喜欢
    • 2014-07-25
    • 1970-01-01
    • 2014-06-09
    • 2016-02-05
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    • 2017-11-21
    • 1970-01-01
    相关资源
    最近更新 更多