编写JavaScript动画时,您当然会使用setInterval(或重复的setTimeout)进行循环.但是在setInterval/setTimeout调用中使用的最佳延迟是什么?
在.animate()函数的jQuery API页面中,用户"fbogner"说:
如果有人感兴趣:动画是使用setInterval"渲染"的,时间超过13毫秒.这很快!Chrome的最快间隔时间约为10毫秒.所有其他浏览器在20-30ms左右"采样".
知道jQuery如何决定使用这个特定的数字吗?
开始赏金.我希望有了解Chromium或Firefox背后的源代码的人可以提供一些可能支持特定帧速率决策的硬性事实.或者可能是动画(或框架)列表及其延迟.我相信这为进行一些研究提供了一个有趣的机会.
有趣 - 我只是花时间看看谷歌的吃豆人来源,看看他们做了什么.他们设置了一系列可能的FPS(90,45,30),从第一个开始,然后每帧检查帧的"慢度"(帧的数量超过其分配的时间).如果慢度超过50ms 20次,则帧速率下降到列表中的下一个(90 - > 45,45 - > 30).看起来帧速率永远不会提升,大概是因为游戏的寿命很短,所以编码就不值得了.
哦,setInterval延迟当然设置为1000 /帧速率.事实上,它们使用setInterval而不是重复的setTimeouts.
我认为这种动态帧率功能非常整洁!
我目前正在开发一个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毫秒用来回调渲染函数).