c++ - 在 SDL 中限制和计算 FPS?
问题描述
我已经编写了这段代码来将 SDL 游戏限制为 60 fps,这是实现 fps 计数的正确方法吗?
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 fps 运行,则一帧需要 16.66666... 毫秒。你的计算会有高达 1 毫秒的误差,这是一帧长度的 6.25%。根据游戏的类型,这实际上可能很明显!
推荐阅读
- c# - EF Core、服务和存储库模式
- uwp - 如何获取 uwp 树视图的节点?
- javascript - 根据 URL 动态更改 DIV 的 css - Angular
- android - 无法在项目的以下配置之间进行选择
- javascript - 如何通过 jQuery/Js 获取外部 js 主机源?
- file - 如何在保存时自动对文件中的一系列行进行排序?
- python - Pandas dataframe 净现值向量化(函数向量化)
- apache-kafka - 如何在 Apache Helix 实例之间传输业务逻辑相关状态?
- php - 如何修复 HTTP ERROR 500 cpanel - laravel
- dart - 适用于 Dart 2.1.0+ 的 Flutter/Dart 语音转文本插件