我注意到,当我在YouTube上播放视频时(在Chrome中),我用CreateJS开发的HTML5游戏的运行速度只有它的平均帧率的一半。是否在浏览器标签页/窗口之间共享requestAnimationFrame()调用?
本身在桌面上 - 运行时没有问题60fps。
YouTube视频在运行吗? 30fps!
奇怪的是,我似乎无法在不同的机器上重现问题。它可能与不同的图形卡/驱动程序响应requestAnimationFrame调用的方式有关吗?
我注意到,当我在YouTube上播放视频时(在Chrome中),我用CreateJS开发的HTML5游戏的运行速度只有它的平均帧率的一半。是否在浏览器标签页/窗口之间共享requestAnimationFrame()调用?
本身在桌面上 - 运行时没有问题60fps。
YouTube视频在运行吗? 30fps!
奇怪的是,我似乎无法在不同的机器上重现问题。它可能与不同的图形卡/驱动程序响应requestAnimationFrame调用的方式有关吗?
不。不同浏览器选项卡不共享RAF呼叫。
如果您有两个浏览器选项卡,每个选项卡都带有RAF循环,则选中的选项卡将运行其RAF循环,而未聚焦的选项卡将停止其RAF。
但是,如果您在单个浏览器选项卡上有多个RAF调用,则所有这些RAF调用将被合并到与显示刷新同步的单个执行中。
RequestAnimationFrame不适用于图形卡或驱动程序级别。这是一个浏览器特定的软件概念,浏览器可以被要求调用程序在某些时候执行一些渲染任务,这些渲染任务是根据浏览器在其处理流程中的位置进行优化的,并且比以前的替代方案更高,例如setTimeout
。
正如@markE正确指出的,当选项卡处于非活动状态时,RAF会暂停,因此不存在与在多个选项卡中进行的RAF相关的性能问题。事实上,在不活动标签中暂停基于RAF的动画的能力是引入它的动机之一。
但是,YouTube不使用RAF。据我所知,YouTube视频继续在后台标签中运行。图形子系统完成了大部分工作,但CPU也涉及到了这一点。像素必须从某个地方引入并馈送到图形系统。在多核CPU上,理论上新的进程可能会使用未充分利用的内核,但在一天结束时,CPU资源是有限的。需要做的工作越多,所有事情越慢,特别是可以投入浏览器或运行浏览器选项卡的特定线程的资源越少。所以,是的,你会看到这样的放缓并不奇怪。
很好的答案!当选项卡未激活时是否可以启用RAF? – 2016-01-21 15:13:58
不是我所知,这是一个浏览器实现问题。 – 2016-01-21 15:22:51
你为什么对此感到惊讶?这是一台带有一个CPU的计算机。它一次只能做很多事情。 – 2014-09-23 02:05:45
这就好像在说“如果我同时运行程序B,我的操作系统运行程序A的速度会降低50%”。我们生活在现代的多线程CPU周期中,多核心。所以不,我不认为皇家空军一次要求它做太多:P – bigp 2014-09-23 10:44:55
我甚至不知道“多线程CPU周期”是什么意思。多线程意味着机器拥有无限资源?如果机器负载很重,其他所有部件都相同,程序确实会运行得更慢。 – 2014-09-23 12:41:02