Bre*_*ugh 9 c++ opengl 3d cross-platform freeglut
我目前正在开发一个OpenGL应用程序,向用户显示一些3D球体,它们可以旋转,移动等等.也就是说,这里的复杂程度并不多,所以应用程序运行得相当高帧速率(~500 FPS).
显然,这是过度的 - 甚至120就足够了,但我的问题是以全速运行应用程序会占用我的CPU,导致过多的热量,功耗等.我想做的是能够让用户设置FPS上限,以便在不需要时不会过度使用CPU.
我正在使用freeglut和C++,并且已经设置了动画/事件处理以使用定时器(使用glutTimerFunc).的glutTimerFunc,但是,只允许设置毫秒的整量-所以,如果我想120 FPS,我能得到的最接近的是(int)1000/120 = 8 ms分辨率,这相当于125 FPS(我知道这是一个neglegible量,但我还是只想把如果我知道系统可以更快地渲染,那么在FPS限制中并获得FPS.
此外,使用glutTimerFunc限制FPS永远不会一致.假设我将我的应用程序限制为100 FPS,它通常不会高于90-95 FPS.同样,我已经尝试计算渲染/计算之间的时间差,但它总是超过限制5-10 FPS(可能是计时器分辨率).
我想这里最好的比较是游戏(例如半条命2) - 你设置你的FPS上限,它总是达到那个确切的数量.我知道我可以在渲染每个帧之前和之后测量时间增量,然后循环直到我需要绘制下一个帧,但这不能解决我的100%CPU使用率问题,也不能解决时序分辨率问题.
有什么办法可以在我的应用程序中实现有效的,跨平台的,可变的帧速率限制器/上限吗?或者,换句话说,是否有任何跨平台(和开源)库实现高分辨率计时器和睡眠功能?
编辑:我更愿意找到一个不依赖于最终用户启用VSync的解决方案,因为我将让他们指定FPS上限.
编辑#2:对于所有推荐SDL的人(我最终将我的应用程序移植到SDL),使用该glutTimerFunc函数触发绘制或使用SDL_Delay等待绘制之间有什么区别吗?每个文档确实提到了相同的警告,但我不确定一个是否比另一个更高效或更低效.
编辑#3:基本上,我试图弄清楚是否有一种(简单的方法)在我的应用程序中实现一个准确的FPS限制器(再次,像Half Life 2).如果这是不可能的,我很可能会切换到SDL(对我来说更有意义的是使用延迟函数而不是glutTimerFunc每x毫秒用来回调渲染函数).
| 归档时间: |
|
| 查看次数: |
6710 次 |
| 最近记录: |