3

尽管以下代码可以节省一些电量,但 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);
}

我搞砸了什么?

4

3 回答 3

1

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

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

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

于 2012-07-08T01:15:17.617 回答
1

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

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

SDL_RENDERER_PRESENTVSYNC FLAG 将当前功能与您的显示器刷新率相匹配。

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

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

于 2015-03-25T14:39:59.687 回答
0

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

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

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

于 2014-05-05T03:41:53.347 回答