在 SDL 中封顶和计算 FPS?



我写了这段代码,将SDL游戏限制在60帧/秒,这是实现帧/秒计数的正确方法吗?

int fps=60;
int desiredDelta=1000/fps;  //desired time b/w frames

while (gameRunning)
{
int starttick=SDL_GetTicks();
// Get our controls and events
while (SDL_PollEvent(&event))
{
if (event.type == SDL_QUIT)
gameRunning = false;
}
window.Clear();
for(Entity& e: entities)
{
window.Render(e);
}
window.Display();
int delta=SDL_GetTicks()-starttick;     //actual time b/w frames
int avgFPS=1000/(desiredDelta-delta);  //calculating FPS HERE
if(delta<desiredDelta)
{
SDL_Delay(desiredDelta-delta);
}

std::cout<<avgFPS<<std::endl;

}

在游戏中通常有两个"帧速率";需要担心的是:显示器的帧率和游戏物理的帧率。理想情况下,以显示器的本机帧速率绘制。要执行此操作,请确保将SDL_RENDERER_PRESENTVSYNC标志传递给SDL_CreateRenderer()

对于游戏的物理特性,您可以测量两个渲染帧之间的时间,并将其用作物理时间步长,以便基本匹配显示帧率。优点是速率是自然同步的,但缺点是游戏的物理特性可能会出现准确性问题,尤其是在渲染时间过长,显示帧速率降至较低值的情况下。

或者,您可以使用固定的帧速率进行物理处理。然而,如果您执行后者,则必须了解如何处理两个帧速率不同步的问题,但这并不能通过添加SDL_Delay()s来解决。通常的方法是让渲染线程根据需要基于物理对动画进行插值。

代码中一个更实际的问题是SDL_GetTicks()以毫秒为单位提供时间。这不是很准确;如果你的显示器以每秒60帧的速度运行,那么一帧需要16.46666…毫秒。您的计算将有高达1毫秒的误差,即一帧长度的6.25%。根据游戏类型的不同,这实际上是值得注意的!

最新更新