Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/448.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript requestAnimationFrame()调用是否在浏览器选项卡/窗口之间共享?_Javascript_Google Chrome_Createjs_Frame Rate_Requestanimationframe - Fatal编程技术网

Javascript requestAnimationFrame()调用是否在浏览器选项卡/窗口之间共享?

Javascript requestAnimationFrame()调用是否在浏览器选项卡/窗口之间共享?,javascript,google-chrome,createjs,frame-rate,requestanimationframe,Javascript,Google Chrome,Createjs,Frame Rate,Requestanimationframe,我注意到,当我在YouTube(Chrome)上播放视频时,我正在用CreateJS开发的HTML5游戏的帧速率只有平时的一半 就其本身而言,在桌面上-运行60fps没有问题 YouTube视频在运行?30帧 奇怪的是,我似乎无法在另一台机器上重现这个问题。这可能与不同的图形卡/驱动程序响应requestAnimationFrame调用的方式有关吗?否。不同的浏览器选项卡不共享RAF调用 如果您有两个浏览器选项卡,每个选项卡都有一个RAF循环,则聚焦的选项卡将运行其RAF循环,而未聚焦的选项卡将

我注意到,当我在YouTube(Chrome)上播放视频时,我正在用CreateJS开发的HTML5游戏的帧速率只有平时的一半

就其本身而言,在桌面上-运行60fps没有问题

YouTube视频在运行?30帧


奇怪的是,我似乎无法在另一台机器上重现这个问题。这可能与不同的图形卡/驱动程序响应requestAnimationFrame调用的方式有关吗?

否。不同的浏览器选项卡不共享RAF调用

如果您有两个浏览器选项卡,每个选项卡都有一个RAF循环,则聚焦的选项卡将运行其RAF循环,而未聚焦的选项卡将停止其RAF循环


但是,如果在单个浏览器选项卡上有多个RAF调用,则所有这些RAF调用都将合并到一个执行中,该执行与显示刷新同步。

RequestAnimationFrame在图形卡或驱动程序级别不起作用。这是一个特定于浏览器的软件概念,可以要求浏览器调用程序执行某些渲染任务,渲染时间根据浏览器在其处理管道中的位置进行优化,并且精度高于较旧的替代方案,如
setTimeout

正如@markE正确指出的,RAF在一个选项卡未激活时暂停,因此在多个选项卡中没有与RAF相关的性能问题。事实上,能够在非活动选项卡中暂停基于RAF的动画是引入它的动机之一


然而,YouTube不使用RAF。据我所知,YouTube视频仍在后台运行。图形子系统完成了大部分工作,但也涉及CPU;像素必须从某个地方输入并输入图形系统。在多核CPU上,新进程理论上可能会使用未充分利用的内核,但最终CPU资源是有限的。它需要做的工作越多,速度就越慢,尤其是它可以用于浏览器或运行浏览器选项卡的特定线程的资源就越少。因此,是的,你会看到这样的减速一点也不奇怪。

为什么你会对此感到惊讶?这是一台有一个CPU的计算机。它一次只能做这么多。这就像说“好吧,如果我同时运行程序B,我的操作系统运行程序会慢50%”。我们生活在多线程CPU周期、多核的现代时代。所以不,我不认为RAF一次要求它做太多:PI甚至不知道“多线程CPU周期”是什么意思。多线程意味着机器拥有无限的资源?如果机器负载很重,那么程序的运行速度确实会变慢,其他条件都一样。所以你是说,因为YouTube上的一个视频在一个窗口中播放,我的RAF在另一个浏览器窗口中调用了一半,因为我的12核CPU正在努力以60fps的速度运行?就其本身而言,RAF是相当轻量级的。它只是管理一个请求队列,并在有机会时调用它们。因此,唯一合乎逻辑的解释是,事实上,浏览器/选项卡的周期越来越少,到达处理管道中调用排队RAF函数的点的频率也越来越低。除此之外,这很难说,特别是因为正如你所说的,这个问题在其他机器上是不可再现的。如果标签在单独的窗口中(并排)会怎么样?它们是否都以全帧速运行?如果选项卡位于浏览器的不同实例中,则动画将继续。好的。谢谢你对英国皇家空军的了解。不幸的是,我仍然不明白我分别运行的两个选项卡是如何导致HTML5游戏的帧率下降的。我想我会删除这个问题,然后用另一个问题重新表述。回答得很好!但在选项卡未激活时是否可以启用RAF?据我所知,这是一个浏览器实现问题。