Chrome 57 のバックグラウンド タブ

バックグラウンド タブは、ブラウザのパフォーマンス(特にバッテリー駆動時間)に大きな悪影響を及ぼす可能性があります。この問題を軽減するため、Chrome ではここ数年、バックグラウンドのタブにさまざまな制限を設定してきました。近年、さらなる改善に向けて多くの取り組みが進められています。このドキュメントでは、Chrome ポリシーの概要を説明します。このドキュメントでは、Chrome 57 の現在のポリシーについて説明します。長期戦略と今後の計画については、こちらのドキュメントをご覧ください。

バックグラウンドでのアプリケーションの最適化

ユーザーは多くのタブをバックグラウンドで開いていることが多いため、電力使用量とバッテリー駆動時間に深刻な影響を与える可能性があることに、ウェブ デベロッパーは注意する必要があります。特定のユーザー エクスペリエンスを提供するために絶対に必要な場合を除き、バックグラウンドでの処理は最小限に抑える必要があります。Page Visibility 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 回バッチで実行し、プロセスのウェイクアップ回数を最小限に抑えます。可聴オーディオを再生するページは、ユーザーに表示されるとみなされ、バックグラウンド タイマーのスロットリングから除外されます。免除は、音声の再生が停止してから数秒間続き、アプリが次の音声トラックをキューに追加できるようにします。

音声は、Chrome に音声アイコンが表示されている場合にのみ、聞こえる音声と見なされます。無音の音声ストリームは免除の対象外です。

予算ベースのバックグラウンド タイマーのスロットリング

Chrome 57 でリリースされた予算ベースのタイマー スロットリングは、タイマーの調整メカニズムのさらなる拡張であり、バックグラウンド タイマーの CPU 使用量に追加の制限を設定します。次のように動作します。

  • 各バックグラウンド タブには、バックグラウンドでタイマーを実行するための時間(秒単位)が設定されています。
  • ページは、バックグラウンドで 10 秒経過すると時間予算の制限を受けます。
  • タイマータスクを実行できるのは、時間予算が正の値の場合のみです。
  • タイマーが実行されると、その実行時間がバジェットから差し引かれます。
  • 予算は時間とともに継続的に再生成されます(現在は 1 秒あたり 0.01 秒のレートに設定されています)。この予算再生成率は、スロットリング動作に関するデータを Chrome が収集するにつれて調整できます。

このスロットリングには、自動的に除外されるものがあります。

  • 音声を再生しているアプリはフォアグラウンドと見なされ、スロットリングは行われません。
  • リアルタイム接続(WebSocket と WebRTC)を使用するアプリケーション(これらの接続がタイムアウトで終了しないようにするため)。このような場合でも、1 秒に 1 回実行されるランタイム ルールが適用されます。

このメカニズムは CPU 時間ではなくウォールタイムを使用します。これは CPU 時間の近似値であり、メインスレッドを長時間ブロックするとペナルティが適用されます。

最後に、バックグラウンドで長いタスクを使用している場合、アプリケーションは非常に長い時間(タスクの長さの最大 100 倍)スロットリングされる可能性があることに注意してください。パフォーマンス ガイドラインに従って、処理を 50 ミリ秒以下のチャンクに分割し、visibilityChange リスナーを使用して、バックグラウンドで不要な処理が行われないようにします。

オプトアウト

Chrome には、テストスイートの実行や、ユーザーが許可したその他の負荷の高い計算などのユースケース向けの --disable-background-timer-throttling フラグが用意されています。