虽然以下代码可以省电,但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);
}
我搞砸了什么?
答案 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标志会将当前功能与您的显示器刷新率相匹配。
我希望这可以帮助!!给我带来了很多麻烦!!!
答案 2 :(得分:0)
这可能是由于SDL_Delay告诉操作系统关闭您正在运行的进程。根据您拥有的操作系统,这可能会在某种意义上导致不同的行为。 SDL_Delay通常并不意味着保证执行在指定的毫秒数之后完全继续。有人说它保证至少等待很长时间才能恢复过程但我无法找到证据。我认为这更像是对操作系统的推荐,但最终操作系统将自行决定(取决于操作系统)。
对于Windows,可以修改上下文切换的粒度,让您更好地控制它:timeBeginPeriod function
你可能不再对此感到疑惑,但也许答案可以帮助别人..