テスト1
私はこの目的のために特別にテストを書きました:
フレームレート分布:setInterval vs requestAnimationFrame
注:このテストはCPUをかなり集中的に使用します。requestAnimationFrame
IE 9およびOpera 12ではサポートされていません。
テストでは、setInterval
とrequestAnimationFrame
を別のブラウザーで実行するのにかかる実際の時間を記録し、結果を分布の形で提供します。のミリ秒数を変更して、setInterval
さまざまな設定でどのように実行されるかを確認できます。遅延に関してはsetTimeout
a setInterval
と同様に機能します。requestAnimationFrame
ブラウザによって異なりますが、通常はデフォルトで60fpsです。別のタブに切り替えたとき、または非アクティブなウィンドウがあるときに何が起こるかを確認するには、ページを開き、別のタブに切り替えてしばらく待ちます。これらの機能にかかる実際の時間は、非アクティブなタブに記録され続けます。
テスト2
それをテストする別の方法は、と繰り返しタイムスタンプを記録することであるsetInterval
とrequestAnimationFrame
し、取り外したコンソールに表示します。タブまたはウィンドウを非アクティブにすると、更新頻度(または更新されているかどうか)を確認できます。
結果
Chrome
Chrome setInterval
は、タブが非アクティブの場合、最小間隔を約1000ミリ秒に制限します。間隔が1000ミリ秒を超える場合、指定した間隔で実行されます。ウィンドウがフォーカスされていなくても問題ありません。間隔は、別のタブに切り替えたときにのみ制限されます。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
#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
、非アクティブなタブでは1000ミリ秒に制限されています。requestAnimationFrame
非アクティブなタブでは常に一時停止されます。
Safari
Chromeと同様に、Safari setInterval
はタブが非アクティブのときに1000ミリ秒で上限を設定します。requestAnimationFrame
も一時停止しています。
Opera
Webkitエンジンの採用以来、OperaはChromeと同じ動作を示します。setInterval
1000msで上限が設定されrequestAnimationFrame
、タブが非アクティブになると一時停止します。
概要
非アクティブなタブの繰り返し間隔:
setInterval requestAnimationFrame
Chrome
9-影響を受けない、サポートされない
10影響を受けず、一時停止
11+> = 1000ms一時停止
Firefox
3-影響を受けない、サポートされない
4は影響を受けない1
5+> = 1000ms 2 n s(n =非アクティブからのフレーム数)
IE
9-影響を受けない、サポートされない
一時停止の影響を受けていない10以上
縁
13-影響を受けず、一時停止
14+> = 1000ms一時停止
サファリ
5-影響なしサポートなし
6影響を受けず、一時停止
7以上> = 1000ミリ秒の一時停止
オペラ
12-影響を受けない、サポートされない
15以上> = 1000ミリ秒の一時停止