C ++ - SDL:限制帧速率问题

时间:2012-07-05 12:50:54

标签: c++ sdl limit frame-rate

虽然以下代码可以省电,但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);
}

我搞砸了什么?

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

创建这样的渲染器时:

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

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

我希望这可以帮助!!给我带来了很多麻烦!!!

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

答案 2 :(得分:0)

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

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

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