瞭解系統運算壓力。
Compute Pressure API 提供高層級狀態,代表系統的壓力。這可讓實作使用正確的基礎硬體指標,確保使用者在系統未受到難以管理的壓力下,能充分利用所有可用的處理效能。
目前狀態
步驟 | 狀態 |
---|---|
1. 建立說明 | 完成 |
2. 建立規格初稿 | 完成 |
3. 收集意見回饋並重複設計 | 進行中 |
4. 來源試用 | 完成 |
5. 發布 | 完成 (Chrome 125) |
試用 Compute Pressure API
如要在本機端試驗 Compute Pressure API,請參閱這個頁面。
註冊參加來源試用
自 Chrome 115 起,Compute Pressure API 可做為來源試用使用。預計將於 Chrome 123 版 (2024 年 5 月 29 日) 結束。註冊來源試用計畫。
使用案例
目前的 Compute Pressure API 強化的主要用途是視訊會議和電玩遊戲。
這些熱門的即時應用程式歸類為軟性應用程式。也就是說,如果系統超出特定狀態,服務品質會降低,但不會導致系統完全故障。這些軟性即時應用程式能夠根據 CPU 耗用量或壓力調整工作負載,因此可獲得極大助益。
具體來說,這個 API 的第一個版本旨在啟用下列調整決策。
視訊會議
- 調整在多人通話期間同時顯示的影片動態饋給數量。
- 降低影片處理品質 (影片解析度、每秒影格數)。
- 略過不必要的影片處理作業,例如某些相機濾鏡。
- 停用非必要的音訊處理功能,例如 WebRTC 降噪功能。
- 在影片和音訊編碼 (在 WebRTC、WebCodecs 或軟體編碼中) 中,將品質與速度和大小與速度的旋鈕轉向「速度」。
電玩遊戲
- 使用較低品質的素材資源來組合遊戲的影片 (3D 模型、紋理、著色器) 和音訊 (語音、音效)。
- 停用會導致非必要細節不夠逼真的效果 (水、布料、火焰動畫、皮膚亮度、眩光效果或不會影響遊戲體驗的物理模擬)。
- 調整遊戲算繪引擎中品質與速度的旋鈕 (陰影品質、紋理篩選、檢視距離)。
從技術層面來說,只要瞭解網站使用的主執行緒和背景工作者,以及熱力 (例如系統是否處於被動冷卻狀態) 和 CPU 壓力狀態,就能達成這些目標。系統熱力狀態是全域狀態,可能會受到觀察網站以外的應用程式和網站影響。
介面
Compute Pressure API 可在以下情境下執行:
- 視窗或主執行緒
- 專屬 Worker
- 共用 Worker
Compute Pressure API 定義了兩個新的介面。
PressureObserver
:用於在預先定義的取樣間隔內,觀察任意來源的運算壓力。Chromium 的第一次疊代會將 "cpu"
公開為 source
。詳情請參閱「參數」一節。每個觀察器都能非同步地觀察系統中的壓力變化趨勢。
PressureRecord
:說明轉換過程中特定時刻的壓力趨勢。您只能透過兩種方式取得這類型別的物件:做為 PressureObserver 回呼的輸入內容,或是在 PressureObserver
例項上呼叫 takeRecords()
方法。
PressureObserver
建立 PressureObserver
物件時,系統會將其設為在指定的取樣間隔內,監控支援來源的壓力。在 PressureObserver
物件的生命週期中,您隨時可以個別觀察或不觀察支援的來源。建立物件後,就無法變更取樣間隔。
建構函式
PressureObserver(callback)
:建立新的 PressureObserver
物件,當系統偵測到所觀察來源的值發生變更時,這個物件會叫用指定的回呼函式。
建構函式會採用必要的 回呼函式。
回撥電話
callback()
:回呼會使用未讀取的 PressureRecord
物件陣列呼叫。
方法
PressureObserver.observe(source, options)
:向「PressureObserver」指出要觀察的來源,以及選用的 options
做為參數。
選項
PressureObserverOptions
:包含使用者要求更新的取樣間隔,以 sampleInterval
為單位 (以毫秒為單位)。
PressureObserver.unobserve(source)
:通知「PressureObserver」停止觀察來源。
PressureObserver.disconnect()
:要求「PressureObserver」停止觀察所有來源。
PressureObserver.takeRecords()
:自上次回呼呼叫以來,傳回一連串記錄。
static PressureObserver.knownSources()
(唯讀):依字母順序傳回使用者代理程式已知的來源類型。
參數
source
:要觀察的來源,例如 "cpu"
。必須是支援的來源類型之一。
目前的 Compute Pressure 版本僅支援 "cpu"
。
PressureRecord
Compute Pressure API 的 PressureRecord
介面會說明來源在特定轉換時刻的壓力趨勢。
執行個體屬性
PressureRecord.source
(唯讀):傳回字串,代表記錄的來源。
PressureRecord.state
(唯讀):傳回字串,代表已記錄的壓力狀態。
PressureRecord.time
(唯讀):傳回代表高解析度時間戳記的數字。
範例
以下各節列出典型用途範例。
判斷 API 支援情形
if ('PressureObserver' in globalThis) {
// The Compute Pressure API is supported.
}
建立壓力觀察器
請呼叫建構函式,並使用回呼函式建立壓力觀察器,以便在壓力更新時執行:
const observer = new PressureObserver((records) => {
/* ... */
});
使用壓力觀察器
啟動壓力觀察器的方法只有一種。針對每個來源呼叫 observer.observe(source)
。
observer.observe("cpu" { sampleInterval: 2_000 });
在本範例中,"cpu"
是我們感興趣的壓力來源。目前這是唯一可用的來源。日後可能會有其他來源,例如 "gpu"
、"power"
或 "thermals"
。
若取樣間隔 sampleInterval
為 2000 毫秒,表示更新頻率最多為每兩秒一次。
如果系統無法提供要求的取樣間隔,就會以最合適的間隔提供樣本。舉例來說,如果要求的間隔為 2000 毫秒,但系統只能提供最多 1000 毫秒的樣本,系統會選取 1000 毫秒。
如要停止觀察來源,請使用 unobserve()
方法,如以下範例所示:
observer.unobserve('cpu');
如要一次取消觀察所有來源,請使用 disconnect()
方法,如以下範例所示:
observer.disconnect();
擷取壓力記錄
您可以使用回呼函式擷取壓力記錄,系統會在壓力狀態發生變更時叫用該函式。
function callback(records) {
const lastRecord = records[records.length - 1];
console.log(`Current pressure ${lastRecord.state}`);
if (lastRecord.state === 'critical') {
// Reduce workers load by 4.
} else if (lastRecord.state === 'serious') {
// Reduce workers load by 2.
} else {
// Do not reduce.
}
}
const observer = new PressureObserver(callback);
await observer.observe('cpu', { sampleInterval: 1_000 });
使用者也可以呼叫 takeRecords()
方法,強制讀取 PressureRecord
。
PressureObserver
介面的 takeRecords()
方法會傳回壓力觀察器中儲存的 PressureRecords
物件陣列,並將其清空。
最常見的用途是,在斷開觀測器之前,立即擷取所有待處理的壓力記錄 (尚未由觀測器的回呼函式處理),以便在關閉觀測器時處理所有待處理的記錄。
呼叫這個方法會清除待處理記錄清單,因此不會執行回呼。
const observer = new PressureObserver((records) => {
/* Do something with records. */
});
await observer.observe('cpu', { sampleInterval: 1_000 });
setTimeout(() => {
// Forced records reading.
const records = observer.takeRecords();
observer.disconnect();
// Do something with last records if any.
}, 2000);
提供意見
API 是否有任何功能無法正常運作?您是否發現任何缺少的方法或屬性,導致您無法使用 API?在對應的 GitHub 存放區中提交規格問題或對現有問題發表意見。
回報實作問題
你是否發現 Chromium 實作項目有錯誤?還是實作方式與規格不同?請前往 new.crbug.com 提交錯誤。請務必提供盡可能多的詳細資料和重現步驟,並在「Components」方塊中輸入「Blink>PerformanceAPIs>ComputePressure」。