C ++如何正确设置FPS的上限使用GLFW

问题描述

所以我一直试图将fps限制为60:


//Those are members inside the display class
double tracker = glfwGetTime();
const float frameCap = 1 / 60.0f;

void display::present() {
    glfwSwapBuffers( _window );

    //Getting the time between each call
    double Now = glfwGetTime( );
    double frameTime=Now - tracker;
    tracker=Now;
    
    //delaying if required
    if ( frameTime < frameCap )
        delay( frameCap - frameTime );
}

@H_502_5@
void game() {
//Creating window and opengl context
.....

//disabling "vsync" so i can cap fps by my own
glfwSwapInterval(0);

 while(running) {
   //Rendering and updating
   .........   

   //Swap buffers and delay if required
   display.present();
 }
}
@H_502_5@

我的延迟/睡眠功能

#ifdef _WIN32
#include <Windows.h>
#else
#include <unistd.h>
#endif

void delay( uint32_t ms )
{
#ifdef _WIN32
    Sleep( ms );
#else
    usleep( ms * 1000 );
#endif
}

@H_502_5@

基本上是在每次display :: present()调用中限制帧速率的想法。

看起来帧速率几乎没有上限,实际上是4000 +

解决方法

对于present您的double frameTime=glfwGetTime( ) - tracker;的第一次调用,请将frameTime设置为当前时间(glfwGetTime()和您的tracker的初始值之间的差设置为glfwGetTime()

在下一行中,您设置tracker=frameTime;frameTime不是时间,而是此处的区别。)

对于下一次调用present,值tracker确实很小(因为它是差异而不是时间),因此,double frameTime=glfwGetTime( ) - tracker;真的很大(更大)而不是frameCap),因此不会发生睡眠。

对于present的下一次调用,( frameTime < frameCap )的条件可能再次成立,但对于顺带一提,它肯定不会再出现了。

因此,至少在第二次调用present时,delay不会被调用。

除了glfwGetTime返回秒,frameCap还代表一帧应该持续多少秒,但是您的void delay( uint32_t ms )期望毫秒。