了解系统计算压力。
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 的第一个版本旨在支持以下自适应决策。
视频会议
- 调整在与多名参与者通话期间同时显示的视频 Feed 数量。
- 降低视频处理画质(视频分辨率、每秒帧数)。
- 跳过不必要的视频处理,例如某些相机滤镜。
- 停用非必需的音频处理,例如 WebRTC 降噪。
- 在视频和音频编码(在 WebRTC、WebCodecs 或软件编码中)中,将质量与速度和大小与速度旋钮向“速度”方向旋转。
视频游戏
- 使用质量较低的资源来构成游戏的视频(3D 模型、纹理、着色器)和音频(语音、音效)。
- 停用会导致不太逼真的非基本细节的效果(水、布、火焰动画、皮肤亮度、眩光效果或不影响游戏内容的物理模拟)。
- 调整游戏渲染引擎中的质量与速度旋钮(阴影质量、纹理过滤、视野距离)。
从技术上讲,这些可以通过了解主线程和网站使用的工作器的热(例如,系统是被动冷却)和 CPU 压力状态来实现。系统热状态是一种全局状态,可能会受到观察位置以外的应用和网站的影响。
接口
Compute Pressure API 可在以下环境中运行:
- 窗口或主线程
- 专用工作器
- 共享工作线程
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"
。此项必须是受支持的来源类型之一。
在计算压力的当前版本中,仅支持 "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 实现中的 bug?还是实现与规范不同?请访问 new.crbug.com 提交 bug。请务必提供尽可能详细的信息、重现说明,并在 Components 框中输入 Blink>PerformanceAPIs>ComputePressure。