バックグラウンドのタブは、ブラウザのパフォーマンス、特にバッテリー駆動時間に悪影響を及ぼします。この問題を軽減するために、Chrome は過去数年にわたり、バックグラウンドのタブにさまざまな制限を課しています。最近では、さらなる改善のためにさまざまな取り組みが行われています。このドキュメントでは、Chrome ポリシーの概要について説明します。このドキュメントでは、Chrome 57 の現在のポリシーについて説明します。 長期的な戦略と今後の計画については、こちらのドキュメントをご覧ください。
バックグラウンド用にアプリを最適化する
ウェブ デベロッパーは、ユーザーがバックグラウンドで多数のタブを開いていることが多いため、電力使用量とバッテリー駆動時間に深刻な影響を及ぼす可能性があることに留意する必要があります。特定のユーザー エクスペリエンスを提供するためにどうしても必要な場合を除き、バックグラウンドでの処理は最小限にとどめる必要があります。PageVisibility API を使用すると、ページがバックグラウンドになった場合を検出して、視覚的な更新などの不要な処理をすべて停止できます。
一部のサイトでは、このシンプルな最適化で CPU 使用率を 75% も削減できます。
var doVisualUpdates = true;
document.addEventListener('visibilitychange', function(){
doVisualUpdates = !document.hidden;
});
function update() {
if (!doVisualUpdates) {
return;
}
doStuff();
}
ポリシー
requestAnimationFrame()
こちらのドキュメントによると、ページがバックグラウンドにあるときに Chrome が requestAnimationFrame()
を呼び出さず、この行為は 2011 年から行われています。
バックグラウンド タイマーの調整
Chrome 11 以降、独立した各タイマーが実行される回数は 1 秒に 1 回までです。Chrome はこれらのタイマーを 1 秒に 1 回バッチで実行し、プロセスの wakeup の回数を最小限に抑えます。可聴音声を再生するページはユーザーが認識できると見なされ、バックグラウンド タイマー スロットリングは適用されません。音声の再生が停止した後、アプリが次の音声トラックをキューに追加できるように、除外は数秒間継続します。
Chrome で音声アイコンが表示されている場合にのみ、音声が聴取可能とみなされます。 サイレント オーディオ ストリームでは除外は適用されません。
予算に基づくバックグラウンド タイマー スロットリング
Chrome 57 でリリースされた機能では、予算ベースのタイマー スロットリングがタイマー調整メカニズムをさらに拡張し、バックグラウンド タイマーの CPU 使用率の上限が設けられています。次のように動作します。
- 各バックグラウンド タブには、バックグラウンドでタイマーを実行するための時間(秒単位)が表示されます。
- ページがバックグラウンドで 10 秒間表示されると、時間制限の制限を受けます。
- タイマータスクは、時間予算が負でない場合にのみ実行できます。
- タイマーが実行されると、その実行時間が予算から差し引かれます。
- 予算は時間の経過とともに継続的に再生成されます(現在は 1 秒あたり 0.01 秒のレートに設定されています)。なお、この予算再生成率は、Chrome でスロットリング動作に関するデータがより多く収集されるにつれて微調整できます。
次のようなスロットリングは自動的に除外されます。
- 音声を再生するアプリはフォアグラウンドとみなされ、スロットリングされません。
- リアルタイム接続を使用するアプリケーション(WebSocket と WebRTC)。タイムアウトによってこれらの接続が閉じられないようにします。このような場合でも、run-timers-once-a-second ルールは適用されます。
このメカニズムでは、CPU 時間ではなく経過時間が使用されます。CPU 時間の近似値であり、メインスレッドを長時間ブロックするとペナルティが発生します。
最後に、バックグラウンドで長いタスクを使用している場合、アプリが非常に長い時間(タスク期間の 100 倍まで)スロットリングされる可能性があります。パフォーマンス ガイドラインに沿って処理を 50 ミリ秒以下のチャンクに分割し、visibilityChange
リスナーを使用してバックグラウンドで不要な処理が発生しないようにします。
オプトアウト
Chrome では、テストスイートやその他のユーザー承認の負荷の高い計算の実行などのユースケース向けに、--disable-background-timer-throttling
フラグを提供しています。