2 c++ opengl sleep frame-rate glfw
我目前正在制作一个我想限制每秒帧数的游戏,但我遇到了问题。这是我在做什么:
我通过这种在每一帧执行的方法获取 deltaTime:
void Time::calc_deltaTime() {
double currentFrame = glfwGetTime();
deltaTime = currentFrame - lastFrame;
lastFrame = currentFrame;
}
Run Code Online (Sandbox Code Playgroud)
deltaTime 具有我期望的值(大约 0.012.... 到 0.016...)
然后我使用 deltaTime 通过睡眠窗口函数来延迟帧,如下所示:
void Time::limitToMAXFPS() {
if(1.0 / MAXFPS > deltaTime)
Sleep((1.0 / MAXFPS - deltaTime) * 1000.0);
}
Run Code Online (Sandbox Code Playgroud)
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) { }
}
}
Run Code Online (Sandbox Code Playgroud)
但是我仍然获得超过 60 fps,我仍然获得 72 fps 左右......我做错了什么还是有更好的方法来做到这一点?
将周期返回给 CPU 有多重要?对我来说,使用 sleep 似乎是一个坏主意。如果我错了,请有人纠正我,但我认为应该避免睡眠功能。
为什么不简单地使用一个无限循环,如果超过一定的时间间隔,则执行该循环。尝试:
const double maxFPS = 60.0;
const double maxPeriod = 1.0 / maxFPS;
// approx ~ 16.666 ms
bool running = true;
double lastTime = 0.0;
while( running ) {
double time = glfwGetTime();
double deltaTime = time - lastTime;
if( deltaTime >= maxPeriod ) {
lastTime = time;
// code here gets called with max FPS
}
}
Run Code Online (Sandbox Code Playgroud)
上次我使用 GLFW 时,它似乎自我限制为 60 fps。如果您正在做任何面向高性能的事情(游戏或 3D 图形),请避免任何休眠的事情,除非您想使用多线程。