瞭解系統的運算壓力。
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 可在下列情境中執行:
- 視窗或主執行緒
- 專門的工作站
- 共用工作站
Compute Pressure API 定義了兩個介面。
PressureObserver
:以預先定義的樣本間隔觀察任意來源運算壓力的物件。Chromium 的首次疊代會將 "cpu"
公開為 source
。詳情請參閱「參數」一節。每個觀察器都能以非同步方式觀察系統中壓力變化趨勢。
PressureRecord
:說明特定轉場時的壓力趨勢。此類型的物件只能以下列兩種方式取得:做為 PressureObserver 回呼的輸入,或是對 PressureObserver
執行個體呼叫 takeRecords()
方法。
PressureObserver
建立 PressureObserver
物件後,系統會按照指定的取樣間隔觀察支援來源的壓力。在 PressureObserver
物件的生命週期內,您可以隨時個別觀察或未觀察支援的來源。建立物件後即無法變更取樣間隔。
建構函式
PressureObserver(callback, options)
:建立新的 PressureObserver
物件,當偵測到觀察到的來源值發生變更時,該物件會叫用指定的回呼函式。
回撥電話
callback()
:系統會以包含未讀取 PressureRecord
物件的陣列呼叫回呼。
選項
PressureObserverOptions
:包含樣本時間間隔 (以毫秒為單位),使用者要求更新時sampleInterval
。
方法
PressureObserver.observe(source)
:告知「PressureObserver」要觀察的資料來源。
PressureObserver.unobserve(source)
:指示「PressureObserver」停止觀察來源。
PressureObserver.disconnect()
:指示「PressureObserver」停止觀察所有來源。
PressureObserver.takeRecords()
:傳回自上次回呼叫用以來的一系列記錄。
static PressureObserver.supportedSources()
(唯讀):傳回硬體支援的來源類型。
參數
source
:要觀察的來源,例如 "cpu"
。這必須是支援的來源類型。
在目前版本的 Compute Pressure 中,僅支援 "cpu"
。
PressureRecord
Compute Pressure API 的 PressureRecord
介面可以說明來源在特定轉換時間的壓力趨勢。
執行個體屬性
PressureRecord.source
(唯讀):傳回字串,代表記錄的來源來源。
PressureRecord.state
(唯讀):傳回代表已記錄壓力狀態的字串。
PressureRecord.time
(唯讀):傳回代表高解析度時間戳記的數字。
示例
是否支援 Compute Pressure API?
if ('PressureObserver' in globalThis) {
// The Compute Pressure API is supported.
}
建立壓力觀察器
呼叫其建構函式來建立壓力觀察器,方法是在每次有壓力更新時執行的回呼函式:
const observer = new PressureObserver(
(records) => { /* ... */ },
{ sampleInterval: 2000 }
);
如果取樣間隔 sampleInterval
為 2000 毫秒,表示最多每兩秒鐘就會更新一次。
如果無法提供要求的樣本間隔。系統將以存在的最佳時間間隔提供樣本。舉例來說,如果要求間隔為 2000 毫秒,但系統提供的樣本不得超過 1000 毫秒,則系統會選取 1000 毫秒。
使用壓力觀察器
啟動壓力觀察器只有一種方法。針對每個來源呼叫 observer.observe(source)
。
observer.observe("cpu");
在此範例中,"cpu"
是我們感興趣的壓力來源。目前,這是唯一可用的來源。未來也可能會有其他來源,例如 "gpu"
、"power"
或 "thermals"
。
如要停止觀察來源,請使用 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, { sampleInterval: 1000 });
await observer.observe("cpu");
使用者也可以呼叫 takeRecords()
方法,強制讀取 PressureRecord
。
PressureObserver
介面的 takeRecords()
方法會傳回儲存在壓力觀察器中的 PressureRecords
物件陣列,並清空該物件。
最常見的用途是在中斷觀察器之前,立即擷取所有尚未由觀察器的回呼函式處理的待處理壓力記錄,這樣在關閉觀察器時,系統就能處理所有待處理的記錄。
呼叫此方法會清除待處理記錄清單,因此回呼不會執行。
const observer = new PressureObserver(
(records) => { /* Do something with records. */ },
{ sampleInterval: 1000 }
);
await observer.observe("cpu");
setTimeout(() => {
// Forced records reading.
const records = observer.takeRecords();
observer.disconnect();
// Do something with last records if any.
}, 2000);
告訴我們 API 設計
有什麼 API 功能不如預期嗎?您認為 API 使用方式中,是否缺少任何方法或屬性?在對應的 GitHub 存放區中提交規格問題,或是對現有存放區加註。
回報導入問題
你在 Chromium 的實作方式中發現錯誤嗎?還是實作與規格不同?前往 new.crbug.com 回報錯誤。請務必盡可能提供詳細資訊、重現簡易操作說明,並在「元件」方塊中輸入 Blink>PerformanceAPIs>ComputePressure。