我目前正在制作一款我想限制每秒帧数的游戏,但我遇到了问题。这就是我正在做的事情:
我通过每帧执行的这种方法获得 deltaTime:
void Time::calc_deltaTime() {
double currentFrame = glfwGetTime();
deltaTime = currentFrame - lastFrame;
lastFrame = currentFrame;
}
deltaTime 具有我期望的值(大约 0.012…. 到 0.016…)
而不是我使用 deltaTime 通过 Sleep windows 函数来延迟帧,如下所示:
void Time::limitToMAXFPS() {
if(1.0 / MAXFPS > deltaTime)
Sleep((1.0 / MAXFPS - deltaTime) * 1000.0);
}
MAXFPS 等于 60,我乘以 1000 以将秒转换为毫秒。尽管一切似乎都正确,但我仍然拥有超过 60 fps 的速度(我达到了 72 fps 左右)
我还使用 while 循环尝试了这种方法:
void Time::limitToMAXFPS() {
double diff = 1.0 / MAXFPS - deltaTime;
if(diff > 0) {
double t = glfwGetTime( );
while(glfwGetTime( ) - t < diff) { }
}
}
但是我的速度仍然超过 60 fps,我仍然在 72 fps 左右……我做错了什么还是有更好的方法来做到这一点?
原文由 user7303074 发布,翻译遵循 CC BY-SA 4.0 许可协议
将周期返回给 CPU 有多重要?对我来说,使用 sleep 似乎是个坏主意。如果我错了,请有人纠正我,但我认为应该避免使用睡眠功能。
为什么不简单地使用一个在超过一定时间间隔后执行的无限循环。尝试:
上次我使用 GLFW 时,它似乎自动限制为 60 fps。如果您正在做任何面向高性能的事情(游戏或 3D 图形),请避免任何会休眠的事情,除非您想使用多线程。