在 C 中限制 FPS

新手上路,请多包涵

我目前正在制作一款我想限制每秒帧数的游戏,但我遇到了问题。这就是我正在做的事情:

我通过每帧执行的这种方法获得 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 许可协议

阅读 629
1 个回答

将周期返回给 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
    }
}

上次我使用 GLFW 时,它似乎自动限制为 60 fps。如果您正在做任何面向高性能的事情(游戏或 3D 图形),请避免任何会休眠的事情,除非您想使用多线程。

原文由 Jacques Nel 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题