【问题标题】:C++ - SDL: Limiting framerate issueC++ - SDL:限制帧率问题
【发布时间】:2012-07-05 21:08:05
【问题描述】:

虽然以下代码可以节省一些电量,但 FPS 的上限并不正确。当它应该将帧速率锁定在 60 FPS 时,我得到 82。30 帧也是如此,我得到 49 FPS。

计算 FPS:

previousTime = currentTime;
currentTime = SDL_GetTicks();
fps_++;

if (currentTime - lastOutput >= 1000)
{
    lastOutput = currentTime;
    fps = fps_; // the variable 'fps' is displayed 
    fps_ = 0;
}

限制 FPS:

if (currentTime - previousTime < 1000 / maxFPS)
{
    SDL_Delay(1000 / maxFPS - currentTime + previousTime);
}

我搞砸了什么?

【问题讨论】:

  • maxFPS 的类型是什么? int (暗示整数除法和舍入误差)或 float ?顺便说一句,更好的 fps 计算不会依赖于 2 个输出之间经过一秒这一事实,而是使用 currentTime 和 lastOutput 之间的差异来提高准确性。
  • 浮动。我不太明白你所说的关于 FPS 计算的内容。
  • 您应该尝试一次步进 1 毫秒。这将为您提供更好的精度。请注意,您永远无法获得准确的 60fps,因为以这种方式计时是不准确的。

标签: c++ sdl limit frame-rate


【解决方案1】:

当你像这样创建渲染器时:

SDL_Renderer *renderPtr = SDL_CreateRenderer(windowPtr, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);

SDL_RENDERER_PRESENTVSYNC FLAG 将使 Present 函数与您的显示器刷新率相匹配。

我希望这可以帮助!让我很头疼!!!

这是一个参考: https://wiki.libsdl.org/SDL_CreateRenderer

【讨论】:

    【解决方案2】:

    这可能是由于 SDL_Delay 告诉操作系统关闭您正在运行的进程这一事实引起的。根据您拥有的操作系​​统,这可能会在某种意义上导致不同的行为。 SDL_Delay 通常并不意味着保证在指定的毫秒数之后继续执行。有人说它保证至少要等那么长时间才能将流程切换回来,但我无法找到证据。我认为这更像是对操作系统的推荐,但最终操作系统将自行决定(取决于操作系统)。

    对于 Windows,可以修改上下文切换的粒度,让您有更好的机会来控制它:timeBeginPeriod function

    您可能不再对此感到疑惑,但也许答案可以帮助其他人..

    【讨论】:

      【解决方案3】:

      我不是专家,但你可以试试这个!

      SDL_Delay(1000 / maxFPS - SDL_GetTicks() + previousTime);
      

      使用新计算的当前时间可能会有所帮助

      【讨论】:

        猜你喜欢
        • 2012-08-26
        • 2018-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-27
        • 1970-01-01
        • 2016-11-19
        • 1970-01-01
        相关资源
        最近更新 更多