测试一
我为此专门编写了一个测试:
帧速率分布:setInterval与requestAnimationFrame
注意:此测试占用大量CPU。requestAnimationFrame
IE 9-和Opera 12-不支持。
该测试记录setInterval
并requestAnimationFrame
在不同的浏览器中运行所需的实际时间,并以分发的形式为您提供结果。您可以更改毫秒数,setInterval
以查看其在不同设置下的运行方式。延迟方面的setTimeout
工作与a类似setInterval
。requestAnimationFrame
通常默认设置为60fps,具体取决于浏览器。要查看切换到其他选项卡或不活动窗口时发生的情况,只需打开页面,切换到其他选项卡,然后等待一段时间。它将继续在不活动的选项卡中记录这些功能的实际时间。
测试二
测试它的另一种方法是使用setInterval
和重复记录时间戳,并requestAnimationFrame
在独立的控制台中查看它。使选项卡或窗口处于非活动状态时,您可以查看其更新频率(或者是否曾经更新)。
结果
当该标签页处于非活动状态时,Chrome浏览
器将最小间隔限制为setInterval
1000毫秒左右。如果间隔大于1000ms,它将以指定的间隔运行。窗口是否聚焦不重要,仅当您切换到其他选项卡时,间隔才会受到限制。requestAnimationFrame
选项卡处于非活动状态时被暂停。
// Provides control over the minimum timer interval for background tabs.
const double kBackgroundTabTimerInterval = 1.0;
https://codereview.chromium.org/6546021/patch/1001/2001
Firefox
与Chrome相似,setInterval
当选项卡(而非窗口)处于非活动状态时,Firefox将最小间隔限制为1000毫秒左右。但是,requestAnimationFrame
当选项卡处于非活动状态时,其运行速度将呈指数级下降,每个帧占用1s,2s,4s,8s等。
// The default shortest interval/timeout we permit
#define DEFAULT_MIN_TIMEOUT_VALUE 4 // 4ms
#define DEFAULT_MIN_BACKGROUND_TIMEOUT_VALUE 1000 // 1000ms
https://hg.mozilla.org/releases/mozilla-release/file/0bf1cadfb004/dom/base/nsGlobalWindow.cpp#l296
Internet Explorer
IE不会限制setInterval
选项卡处于非活动状态时的延迟,但是会在选项卡处于非活动状态时暂停requestAnimationFrame
。窗口是否聚焦不重要。
边缘
从边缘14开始,setInterval
在不活动的选项卡中,上限为1000ms。requestAnimationFrame
总是在非活动标签中暂停。
Safari
就像Chrome,Safari帽一样setInterval
该标签页处于非活动状态时为1000毫秒。requestAnimationFrame
也暂停了。
Opera
自从采用Webkit引擎以来,Opera表现出与Chrome相同的行为。setInterval
上限为1000毫秒,requestAnimationFrame
在该标签页处于非活动状态时会暂停。
摘要
非活动标签的重复间隔:
setInterval requestAnimationFrame
Chrome
9-不受影响,不支持
10个不受影响的暂停
11+> = 1000ms暂停
火狐浏览器
3-不受影响不支持
4个未受影响的1s
5+> = 1000毫秒2 Ñ S(N =由于不活动帧的数量)
IE浏览器
9-不受影响,不支持
10+不受影响已暂停
边缘
13-不受影响暂停
14+> = 1000ms暂停
苹果浏览器
5-不受影响,不支持
6不受影响暂停
7+> = 1000ms暂停
歌剧
12-不受影响,不受支持
15+> = 1000ms暂停