Chrome 57 的背景分頁

背景分頁可能會對瀏覽器效能產生重大負面影響,尤其是電池續航力。為減緩此問題,Chrome 過去幾年來針對背景分頁設有多項限制。近期我們持續努力做出進一步改善,而本文將概略說明 Chrome 政策。本文件著重說明目前 Chrome 57 版的政策,如需長期策略和後續計畫,請參閱這份文件

針對背景應用程式進行最佳化

網站開發人員應瞭解,使用者經常在背景開啟許多分頁,這可能會對耗電量和電池續航力造成嚴重影響。除非有特定使用者體驗的必要性,否則在背景執行工作時,請盡量減少作業。請使用 PageVisibility API 偵測網頁何時在背景執行,並暫停所有不必要的作業,例如視覺更新。

部分網站的簡易最佳化功能可以最多減少 75% 的 CPU 使用率:

var doVisualUpdates = true;

document.addEventListener('visibilitychange', function(){
    doVisualUpdates = !document.hidden;
});

function update() {
    if (!doVisualUpdates) {
    return;
    }
    doStuff();
}

政策

requestAnimationFrame()

根據說明文件,當頁面在背景執行時,Chrome 不會呼叫 requestAnimationFrame()。這項行為從 2011 年就開始實施。

背景計時器對齊方式

Chrome 11 開始,每個獨立計時器每秒只能執行一次。Chrome 每秒會分批執行這些計時器,確保程序喚醒次數維持在最低限度。播放有聲音訊的網頁會視為可向使用者顯示,且不受背景計時器節流限制。豁免在音訊停止播放後會持續幾秒鐘,以便應用程式將下一個音軌排入佇列。

請注意,只有 Chrome 顯示音訊圖示時,才會將音訊判定為有聲。 請注意,靜音的音訊串流無法豁免例外狀況。

以預算為基礎的背景計時器節流

Chrome 57 版運送功能:預算式計時器節流是計時器對齊機制的進一步延伸,具有背景計時器 CPU 使用量的額外限制。運作方式如下:

  • 每個背景分頁在背景設有執行計時器的時間 (以秒為單位)。
  • 背景播放 10 秒後,網頁必須遵守時間預算限制。
  • 只有在時間預算不是負數時,系統才會執行計時器工作。
  • 計時器執行完畢後,就會從預算中扣除執行時間。
  • 預算會持續隨時間重新產生 (目前設定為每秒 0.01 秒)。請注意,Chrome 會收集更多節流行為相關資料,因此調整預算重新產生率。

此節流有許多自動豁免項目:

  • 將播放音訊的應用程式視為前景,並未進行節流處理。
  • 採用即時連線 (WebSocket 和 WebRTC) 的應用程式,可避免因逾時而關閉這些連線。在這些情況下,系統仍會套用執行時間為一秒的規則。

請注意,這個機制使用的是實際時間,而非 CPU 作業時間。建議您參考 CPU 作業時間,以及長時間封鎖主執行緒的懲處。

最後請注意,如果您在背景使用較長的工作,應用程式可能會長時間執行節流作業 (最多可達工作時間長度的 100 倍)。根據效能指南,將工作分割為不超過 50 毫秒的區塊,並使用 visibilityChange 事件監聽器,避免在背景中執行不必要的工作。

選擇不採用

Chrome 提供 --disable-background-timer-throttling 旗標,用於執行測試套件,以及其他由使用者認可的繁重運算等用途。