Obtén información sobre la presión de procesamiento del sistema.
La API de Compute Pressure ofrece estados de alto nivel que representan la presión sobre el sistema. Permite que la implementación use las métricas de hardware subyacentes correctas para garantizar que los usuarios puedan aprovechar toda la potencia de procesamiento disponible, siempre y cuando el sistema no esté bajo una tensión inmanejable.
Estado actual
Paso | Estado |
---|---|
1. Crea una explicación | Completar |
2. Crea un borrador inicial de la especificación | Completo |
3. Recopila comentarios y itera en el diseño | En curso |
4. Prueba de origen | Completado |
5. Lanzamiento | Completada (Chrome 125) |
Prueba la API de Compute Pressure
Para experimentar con la API de Compute Pressure de forma local, lee esta página.
Regístrate para la prueba de origen
A partir de Chrome 115, la API de Compute Pressure está disponible como una prueba de origen. Se espera que finalice en Chrome 123 (29 de mayo de 2024). Regístrate para la prueba de origen.
Casos de uso
Los casos de uso principales mejorados por la API de Compute Pressure actual son las videoconferencias y los videojuegos.
Estas aplicaciones populares en tiempo real se clasifican como flexibles. Es decir, la calidad del servicio se degrada si el sistema se ejercita más allá de ciertos estados, pero no genera una falla total del sistema. Estas aplicaciones en tiempo real suaves se benefician en gran medida de poder adaptar sus cargas de trabajo en función del consumo o la presión de la CPU.
Específicamente, el objetivo de la primera versión de esta API es habilitar las siguientes decisiones de adaptación.
Videoconferencias
- Ajusta la cantidad de feeds de video que se muestran de forma simultánea durante las llamadas con muchos participantes.
- Reduce la calidad del procesamiento de video (resolución de video, fotogramas por segundo).
- Omitir el procesamiento de video no esencial, como algunos filtros de cámara
- Inhabilita el procesamiento de audio no esencial, como la supresión de ruido de WebRTC.
- Gira los controles de calidad frente a la velocidad y el tamaño frente a la velocidad en la codificación de audio y video (en WebRTC, WebCodecs o codificación de software).
Videojuegos
- Usa recursos de menor calidad para componer el video (modelos 3D, texturas y sombreadores) y el audio (voces y efectos de sonido) del juego.
- Inhabilita los efectos que generen detalles menos realistas y no esenciales (agua, tela, animaciones de fuego, luminancia de la piel, efectos de reflejo o simulaciones físicas que no afecten el juego).
- Ajusta los controles de calidad y velocidad en el motor de renderización del juego (calidad de las sombras, filtrado de texturas, distancia de visualización).
Técnicamente, estos se pueden lograr si conoces los estados de temperatura (por ejemplo, si el sistema se enfría de forma pasiva) y los estados de presión de la CPU del subproceso principal y los trabajadores que usa el sitio. El estado térmico del sistema es global y puede verse afectado por apps y sitios que no sean el sitio de observación.
Interfaces
La API de Compute Pressure se puede ejecutar en los siguientes contextos:
- Ventana o subproceso principal
- Trabajador dedicado
- Trabajador compartido
La API de Compute Pressure define dos interfaces nuevas.
PressureObserver
: Es un objeto para observar la presión de procesamiento de cualquier cantidad de fuentes en un intervalo de muestra predefinido. La primera iteración en Chromium expone "cpu"
como source
. Consulta la sección sobre los parámetros para obtener más detalles. Cada observador puede observar de forma asíncrona las tendencias de los cambios de presión en un sistema.
PressureRecord
: Describe la tendencia de presión en un momento específico de la transición. Los objetos de este tipo solo se pueden obtener de dos maneras: como entrada a la devolución de llamada de PressureObserver o llamando al método takeRecords()
en la instancia PressureObserver
.
PressureObserver
Cuando se crea un objeto PressureObserver
, se configura para observar la presión de las fuentes compatibles, en un intervalo de muestra determinado. Las fuentes compatibles se pueden observar o no de forma individual en cualquier momento durante la vida útil del objeto PressureObserver
. El intervalo de muestra no se puede cambiar después de la creación del objeto.
Constructor
PressureObserver(callback)
: Crea un nuevo objeto PressureObserver
que invocará una función de devolución de llamada especificada cuando detecte que se produjo un cambio en los valores de la fuente que se observa.
El constructor toma una función de devolución de llamada obligatoria.
Devolución de llamada
callback()
: Se llama a la devolución de llamada con un array de objetos PressureRecord
no leídos.
Métodos
PressureObserver.observe(source, options)
: Le indica a "PressureObserver" qué fuente observar y options
opcional, como parámetros.
Opciones
PressureObserverOptions
: Contiene el intervalo de muestra, sampleInterval
en milisegundos, en el que el usuario solicita actualizaciones.
PressureObserver.unobserve(source)
: Le indica a "PressureObserver" que deje de observar una fuente.
PressureObserver.disconnect()
: Le indica a "PressureObserver" que deje de observar todas las fuentes.
PressureObserver.takeRecords()
: Muestra una secuencia de registros desde la última invocación de devolución de llamada.
static PressureObserver.knownSources()
(de solo lectura): Muestra los tipos de fuentes conocidos del usuario-agente en orden alfabético.
Parámetros
source
: Es la fuente que se observará, por ejemplo, "cpu"
. Debe ser uno de los
tipos de fuentes admitidos.
En la versión actual de Compute Pressure, solo se admite "cpu"
.
PressureRecord
La interfaz PressureRecord
de la API de Compute Pressure describe la tendencia de presión de una fuente en un momento específico de transición.
Propiedades de la instancia
PressureRecord.source
(solo lectura): Muestra una string que representa la fuente de origen de la que proviene el registro.
PressureRecord.state
(solo lectura): Muestra una cadena que representa el estado de presión registrado.
PressureRecord.time
(de solo lectura): Muestra un número que representa una marca de tiempo de alta resolución.
Ejemplos
En las siguientes secciones, se enumeran ejemplos de uso.
Determina la compatibilidad de la API
if ('PressureObserver' in globalThis) {
// The Compute Pressure API is supported.
}
Crea un observador de presión
Para crear el observador de presión, llama a su constructor con una función de devolución de llamada que se ejecutará cada vez que haya una actualización de presión:
const observer = new PressureObserver((records) => {
/* ... */
});
Uso del observador de presión
Solo hay una forma de iniciar un observador de presión. Para cada fuente, llama a observer.observe(source)
.
observer.observe("cpu" { sampleInterval: 2_000 });
En este ejemplo, "cpu"
es la fuente de presión que nos interesa. Por ahora, es la única fuente disponible. En el futuro, es posible que haya otras fuentes, como "gpu"
, "power"
o "thermals"
.
Un intervalo de muestra, sampleInterval
, de 2, 000 ms significa que habrá actualizaciones como máximo cada dos segundos.
Si el sistema no puede entregar el intervalo de muestra solicitado, proporcionará muestras en el intervalo más adecuado que exista. Por ejemplo, si se solicita un intervalo de 2,000 ms, pero el sistema solo puede proporcionar muestras de 1,000 ms como máximo, se seleccionarán 1,000 ms.
Para dejar de observar una fuente, usa el método unobserve()
, como en el siguiente ejemplo:
observer.unobserve('cpu');
Para dejar de observar todas las fuentes a la vez, usa el método disconnect()
, como en
el siguiente ejemplo:
observer.disconnect();
Cómo recuperar registros de presión
Los registros de presión se pueden recuperar con una función de devolución de llamada, que se invocará cada vez que se produzca un cambio en el estado de presión.
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 });
El usuario también puede forzar la lectura de PressureRecord
llamando al método takeRecords()
.
El método takeRecords()
de la interfaz PressureObserver
muestra un array de objetos PressureRecords
almacenados en el observador de presión y lo vacía.
El caso de uso más común para esto es recuperar de inmediato todos los registros de presión pendientes que aún no procesa la función de devolución de llamada del observador antes de desconectarlo, de modo que se puedan procesar los registros pendientes cuando se cierre el observador.
Si llamas a este método, se borrará la lista de registros pendientes, por lo que no se ejecutará la devolución de llamada.
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);
Comparte tus comentarios
¿Hay algo en la API que no funcione como esperabas? ¿Falta algún método o propiedad para tu uso de la API? Informa un problema de especificación o comenta uno existente en el repositorio de GitHub correspondiente.
Denuncia un problema con la implementación
¿Encontraste un error con la implementación de Chromium? ¿O la implementación es diferente de la especificación? Informa un error en new.crbug.com. Asegúrate de incluir la mayor cantidad de detalles posible, así como instrucciones para la reproducción, y, luego, ingresa Blink>PerformanceAPIs>ComputePressure en el cuadro Componentes.
Recursos
- Especificaciones
- Explicación pública
- Demo de la API de Compute Pressure | Fuente de la demo de la API de Compute Pressure
- Error de seguimiento de Chromium
- Entrada de ChromeStatus.com
- Componente de parpadeo:
Blink>PerformanceAPIs>ComputePressure
- Revisión de TAG
- Listo para la prueba
- Página de instructivos
- Intención de experimentar