问题描述
所以我一直试图将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 )
期望毫秒。