如何解决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 );
}
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();
}
}
我的延迟/睡眠功能
#ifdef _WIN32
#include <Windows.h>
#else
#include <unistd.h>
#endif
void delay( uint32_t ms )
{
#ifdef _WIN32
Sleep( ms );
#else
usleep( ms * 1000 );
#endif
}
基本上是在每次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 )
期望毫秒。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。