API de Compute Pressure

Inf�rmate sobre la presi�n de procesamiento de tu sistema.

Kenneth Christiansen
Kenneth Christiansen
Arnaud (Arno) Mandy

La API de presi�n de procesamiento 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 para ellos, siempre que el sistema no est� bajo un estr�s inmanejable.

Estado actual

Step Estado
1. Crear explicaci�n Completo
2. Crea el borrador inicial de la especificaci�n Completo
3. Recopila comentarios e itera en el dise�o En curso
4. Prueba de origen Completo
5. Lanzamiento Completo (Chrome 125)

Prueba la API de Compute Pressure

Para experimentar con la API de Compute Pressure de forma local, lee esta p�gina.

Registrarse para la prueba de origen

A partir de Chrome 115, la API de Compute Pressure est� disponible como 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 defectuosas. Es decir, la calidad del servicio se degrada si el sistema se ejerce m�s all� de ciertos estados, pero no conduce a una falla total del sistema. Estas aplicaciones flexibles en tiempo real 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, la primera versi�n de esta API tiene como objetivo permitir las siguientes decisiones de adaptaci�n.

Videoconferencias

  • Ajusta la cantidad de feeds de video que se muestran simultáneamente durante las llamadas con muchos participantes.
  • Reduce la calidad del procesamiento de video (resolución de video, fotogramas por segundo).
  • Omite el procesamiento de video no esencial, como algunos filtros de la cámara.
  • Inhabilita el procesamiento de audio no esencial, como la supresión de ruido de WebRTC.
  • Cambia los controles de calidad frente a velocidad y tamaño contra velocidad a la “velocidad” en la codificación de audio y video (en WebRTC, WebCodecs o codificación de software).

Videojuegos

  • Usa elementos de menor calidad para componer el video (modelos 3D, texturas, sombreadores) y audio (voces, efectos de sonido) del juego.
  • Inhabilita los efectos que generen detalles no esenciales menos realistas (agua, ropa, animaciones de fuego, luminancia de la piel, efectos de reflejo o simulaciones físicas que no afecten el juego).
  • Ajusta los controles de calidad frente a velocidad en el motor de renderización del juego (calidad de las sombras, filtrado de texturas, distancia de visualización).

Técnicamente, esto se puede lograr si se conocen los estados térmicos (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 un estado global y puede verse afectado por apps y sitios distintos del sitio de observación.

Interfaces

La API de presión de procesamiento se puede ejecutar en los siguientes contextos:

  • Ventana o subproceso principal
  • Trabajador dedicado
  • Trabajador compartido

La API de presión de procesamiento 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 cambios de presi�n en un sistema.

PressureRecord: Describe la tendencia de presi�n en un momento espec�fico de transici�n. Los objetos de este tipo solo se pueden obtener de dos maneras: como entrada para la devoluci�n de llamada de PressureObserver o mediante una llamada 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 admitidas se pueden observar o no observar de forma individual en cualquier momento durante la vida �til del objeto PressureObserver. El intervalo de muestra no se puede cambiar despu�s de crear el 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() (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 compatibles.

En la versi�n actual de presi�n de procesamiento, solo se admite "cpu".

PressureRecord

En la interfaz PressureRecord de la API de Compute Pressure, se describe la tendencia de presi�n de una fuente en un momento espec�fico de la 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 string que representa el estado de presi�n registrado.

PressureRecord.time (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 manera de iniciar un observador de presi�n. Para cada llamada de origen 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, puede haber otras fuentes, como "gpu", "power" o "thermals".

Un intervalo de muestra, sampleInterval, de 2,000 ms, significa que habr� actualizaciones cada dos segundos como m�ximo.

Si el sistema no puede entregar el intervalo de muestras solicitado, este proporcionar� las 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 en un m�ximo de 1,000 ms, 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();

Recupera 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, que lo vac�a.

El caso de uso m�s com�n para esto es recuperar de inmediato todos los registros de presi�n pendientes, a�n no procesados por la funci�n de devoluci�n de llamada del observador, antes de desconectar al observador, 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 sobre la API que no funcione como esperabas? �Ves alg�n m�todo o propiedad faltante para tu uso de la API? Informa un problema de especificaciones o comenta sobre uno existente en el repositorio de GitHub correspondiente.

Informar un problema con la implementaci�n

�Encontraste un error en la implementaci�n de Chromium? �La implementaci�n es diferente de las especificaciones? Informa un error en new.crbug.com. Aseg�rate de incluir tantos detalles como puedas, instrucciones para reproducir el problema y, luego, ingresa Blink>PerformanceAPIs>ComputePressure en el cuadro Componentes.

Recursos