测试一
我为此编写了一个特定的测试:
帧率分布:setInterval vs requestAnimationFrame
注意:此测试对CPU要求较高。IE 9- 和 Opera 12- 不支持requestAnimationFrame
。
该测试记录了setInterval
和requestAnimationFrame
在不同浏览器中运行所需的实际时间,并以分布形式呈现结果。您可以更改setInterval
的毫秒数,以查看不同设置下的运行情况。setTimeout
与延迟相关类似于setInterval
。在大多数浏览器中,默认情况下requestAnimationFrame
通常默认为每秒60帧。为了查看在切换到其他选项卡或有不活动窗口时会发生什么,请打开页面,切换到其他选项卡并等待一段时间。它将继续记录这些函数所需的实际时间。
测试二
另一种测试方法是使用setInterval
和requestAnimationFrame
重复记录时间戳,并在分离的控制台中查看它。在您使选项卡或窗口不活动时,您可以看到它更新的频率(或是否更新)。
结果
Chrome
在选项卡不活动时,Chrome将setInterval
的最小间隔限制为约1000ms。如果间隔大于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。然而,requestAnimationFrame
在选项卡处于非活动状态时以指数方式变慢,每帧需要1秒、2秒、4秒、8秒等。
// The default shortest interval/timeout we permit
https://hg.mozilla.org/releases/mozilla-release/file/0bf1cadfb004/dom/base/nsGlobalWindow.cpp#l296
Internet Explorer
当标签页不活跃时,IE不限制setInterval
的延迟,但暂停非活跃标签页中的requestAnimationFrame
。窗口是否失去焦点都没有影响。
Edge
从Edge 14开始,在非活跃标签页中,setInterval
被限制为1000ms。requestAnimationFrame
总是在非活跃标签页中暂停。
Safari
就像Chrome一样,当标签页不活跃时,Safari将setInterval
限制在1000ms。同时requestAnimationFrame
也会暂停。
Opera
自采用Webkit引擎以来,Opera表现出与Chrome相同的行为。当标签页不活跃时,setInterval
被限制在1000ms,而requestAnimationFrame
被暂停。
总结
非活跃标签页中的重复间隔:
setInterval requestAnimationFrame
Chrome
9- 不受影响 不支持
10 不受影响 暂停
11+ >=1000ms 暂停
Firefox
3- 不受影响 不支持
4 不受影响 1s
5+ >=1000ms 2nns (n = inactivity以来的帧数)
IE
9- 不受影响 不支持
10+ 不受影响 暂停
Edge
13- 不受影响 暂停
14+ >=1000ms 暂停
Safari
5- 不受影响 不支持
6 不受影响 暂停
7+ >=1000ms 暂停
Opera
12- 不受影响 不支持
15+ >=1000ms 暂停
setInterval
/setTimeout
时间低于1000ms会更改为1000ms。 - IansetInterval
/setTimeout
时间被更改为1000毫秒。不清楚您要传达什么信息。 - Amol M Kulkarni