2012-07-05 201 views
2

虽然下面的代码可以节省一些电能,但FPS的上限并不正确。当它应该以60 FPS锁定帧速率时,我得到82.同样的30,我得到49 FPS。C++ - SDL:限制帧率问题

计算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

是什么maxFPS的类型? int(暗示整数除法和舍入误差)还是浮点数? 顺便说一句,更好的fps计算不会依赖于2个输出之间经过一秒的事实,使用currentTime和lastOutput之间的差异来提高准确性。 – Zeograd 2012-07-05 12:55:48

+0

浮动。我没有完全理解你对FPS计算的看法。 – Aaron 2012-07-05 13:17:47

+0

您应该一次尝试步进1ms。这会给你更好的精度。请注意,您永远不会准确地达到60fps,因为以这种方式进行计时很不准确。 – imallett 2012-07-06 01:40:25

回答

1

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

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

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

+0

也不起作用,但是谢谢。 – Aaron 2012-07-08 05:55:51

0

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

对于Windows,上下文切换的粒度可以修改,虽然,给你一个更好的机会来控制这一点:timeBeginPeriod function

你可能不知道这个了,但也许回答能帮助别人..

1

当你创建一个这样的渲染:

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

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

我希望这可以帮助!已经引起我很多头痛!

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