测试一
我为此专门编写了一个测试:
Frame Rate Distribution: setInterval vs requestAnimationFrame
注意:此测试占用大量 CPU。requestAnimationFrame
IE 9- 和 Opera 12- 不支持。
setInterval
测试记录 a和在不同浏览器中运行的实际时间,requestAnimationFrame
并以分布的形式为您提供结果。您可以更改毫秒数,setInterval
以查看它在不同设置下的运行方式。在延迟方面与setTimeout
a 类似。通常默认为 60fps,具体取决于浏览器。要查看当您切换到其他选项卡或有一个非活动窗口时会发生什么,只需打开页面,切换到其他选项卡并等待一段时间。它将继续在非活动选项卡中记录这些功能所花费的实际时间。setInterval
requestAnimationFrame
测试二
另一种测试它的方法是重复记录时间戳,setInterval
并requestAnimationFrame
在分离的控制台中查看它。当您使选项卡或窗口处于非活动状态时,您可以查看它的更新频率(或是否曾经更新)。
结果
Chrome
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,Firefox将最小间隔限制setInterval
为大约1000ms,当TAB(不是窗口)不活动时。但是,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
在非活动选项卡中暂停。窗口是否失焦并不重要。
Edge
从 Edge 14 开始,setInterval
在非活动选项卡中的上限为 1000 毫秒。requestAnimationFrame
总是在非活动标签中暂停。
野生动物园
就像Chrome一样,setInterval
当标签不活动时,Safari帽子在1000ms上盖。requestAnimationFrame
也被暂停。
Opera
自从采用 Webkit 引擎以来,Opera 表现出与 Chrome 相同的行为。setInterval
上限为 1000 毫秒,并requestAnimationFrame
在选项卡处于非活动状态时暂停。
概括
非活动标签的重复间隔:
setInterval requestAnimationFrame
Chrome
9- 不受影响 不支持
10 不受影响暂停
11+ >=1000ms 暂停
火狐
3- 不受影响 不支持
4 不受影响 1s
5+ >=1000ms 2 n s(n = 自不活动以来的帧数)
IE
9- 不受影响 不支持
10+ 不受影响已暂停
边缘
13-不受影响暂停
14+ >=1000ms 暂停
苹果浏览器
5- 不受影响 不支持
6 不受影响 暂停
7+ >=1000ms 暂停
歌剧
12- 不受影响 不支持
15+ >=1000ms 暂停