谷歌chrome和FPS的奇怪行为
Strange behavior with google chrome and FPS
我已经编写了一个小引擎,在Canvas2D中使用javascript显示5个精灵。一切都很好,完全优化了。
FPS在30到60之间波动,但有趣的是,当谷歌javascript控制台打开时,它显示的是恒定的60 FPS!
还有其他人经历过这种情况吗?
n.b.我正在使用requestAnimationFrame
编辑:
示例:http://jsfiddle.net/jrPNy/1
使用"粒子数"进行"四处播放",使您的fps约为40-50。然后打开控制台,它会达到每秒60帧。(铬21.0.1180.83)
我在我的机器上测试了这个,降低了CPU速度,这样我就不会总是得到60FPS。在提供的Fiddle示例中,我通常有大约24FPS。打开控制台将可见画布缩小到原始大小的60%左右,FPS平均增加到30。调整控制台的大小会相应地影响FPS:在只有10%的画布可见的情况下,FPS在42左右摆动,而在一个非常小的控制台和整个画布可见的条件下,FPS略低于原始值,达到23。无论控制台的状态如何,增加CPU速度都会使FPS达到恒定的60。
现在,考虑到生成屏幕的JavaScript仍在运行,无论画布有多少是可见的,影响所需处理能力的是画布的实际渲染,以及画布图像合成到HTML的其余部分、浏览器窗口和屏幕上的方式。越来越多的工作被转移到GPU上,所以当合成过程的每个阶段都将在OpenGL中完成时,FPS应该总是达到最大值。
我在macbook上使用chrome时也经历了同样的事情。osx停靠似乎导致帧速率下降,当您打开控制台时,视口移动到离停靠足够远的位置,帧速率可以恢复到60fps。如果将窗口从固定位置移开,则帧速率会上升。如果自动隐藏底座,则可以在不打开控制台的情况下实现60fps的全屏显示。
对我来说,最好的方法是使用函数
//Don't change these variable names
const times = [];
let fps;
//Replace refreshLoop with the name of your animation loop
function refreshLoop() {
window.requestAnimationFrame(() => {
const now = performance.now();
while (times.length > 0 && times[0] <= now - 1000) {
times.shift();
}
times.push(now);
fps = times.length;
//Replace refreshLoop with your animation loop here as well
refreshLoop();
});
}
//Don't forget to call it again here if you haven't!
refreshLoop();
注意:切换选项卡时,将出现低FPS。当您切换回显示FPS的选项卡时,它将增加,直到实际的FPS匹配为止。这不会影响性能显示本身。
谷歌chrome使用vsync,这意味着它将把FPS限制在你的屏幕FPS限制内。大多数屏幕都是60 FPS,所以如果可能的话,你的谷歌会匹配它,但不会超过它。可能有一个程序可以删除vsync,但我知道Nvidia驱动程序可以控制它,但你需要GTX 610或更高版本才能完成
- Chrome WebKitGetUserMedia
- JQueryhide()不适用于Mozzilla,但适用于Chrome
- 在chrome.tabs.onCreated之后加载HTML页面
- chrome扩展中的navigator.geolocation.getCurrentPosition
- chrome扩展:尽管运行了at:documentidle,js脚本还是过早启动
- document.open/document.write没有正确地清除chrome中的文档——这是chrome的错误吗
- chrome扩展更改主机/域警告
- Chrome开发工具(如何知道我在调用哪个javascript对象)
- 如何在chrome扩展中重定向到html页面
- Chrome扩展没有't在重新加载之前考虑期权价值
- Google/html5语音识别JavaScript SDK Chrome网络工具包SpeechRecognition
- 激活chrome上的chrome.notifications对象
- 如何通过自己获得Chrome扩展的用户反馈/错误报告
- JS可以在Chrome中工作,但不能在Firefox中工作
- Chrome加载旧版本的Javascript文件
- 试图阻止Chrome通过扩展关闭
- 如何在chrome扩展中存储数据/结果,以及如何使用setTimeout使其只被调用一次
- JS表单提交"无法使用Chrome数据保护程序加载此页面.尝试重新加载页面.调试信息:POST CISmtuK
- 是什么让一个“;Uncaught RangeError:超过了最大调用堆栈大小“;错误(Chrome,在其他浏览器中显示
- 谷歌chrome和FPS的奇怪行为