在 C++ 中限制 FPS

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 左右......我做错了什么还是有更好的方法来做到这一点?

Jac*_*Nel 5

将周期返回给 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 图形),请避免任何休眠的事情,除非您想使用多线程。

  • 为什么这似乎是个坏主意?为什么你认为应该避免睡眠?睡眠可以节省电力并减少 CPU 的热量,所以对我来说这似乎只是一个好主意。 (2认同)
  • 这个解决方案浪费了 CPU/GPU 周期,这不是一件好事。我可以提到 CPU/GPU 发热、移动设备上的充电/电池寿命、电力和环境影响、用户对其他任务的响应......这就像仅以 1 档驾驶汽车一样 (2认同)