Saiba mais sobre a pressão de computação do sistema.
A API Compute Pressure oferece estados de alto nível que representam a pressão no sistema. Ela permite que a implementação use as métricas de hardware subjacentes corretas para garantir que os usuários possam aproveitar todo o poder de processamento disponível, desde que o sistema não esteja sob estresse manejável.
Status atual
Etapa | Status |
---|---|
1. Criar uma explicação | Concluído |
2. Criar um rascunho inicial da especificação | Concluído |
3. Coletar feedback e iterar o design | Em andamento |
4. Teste de origem | Concluído |
5. Lançamento | Concluído (Chrome 125) |
Testar a API Compute Pressure
Para testar a API Compute Pressure localmente, leia esta página.
Inscreva-se no teste de origem
A partir do Chrome 115, a API Compute Pressure está disponível como um teste de origem. A expectativa é que ele seja encerrado no Chrome 123 (29 de maio de 2024). Inscreva-se no teste de origem.
Casos de uso
Os principais casos de uso aprimorados pela API Compute Pressure atual são videoconferências e videogames.
Esses aplicativos em tempo real são classificados como soft. Ou seja, a qualidade do serviço se degrada se o sistema for usado além de determinados estados, mas não leva a uma falha total do sistema. Esses aplicativos flexíveis em tempo real se beneficiam muito ao adaptar as cargas de trabalho com base no consumo ou na pressão da CPU.
Especificamente, o objetivo da primeira versão dessa API é permitir as decisões de adaptação abaixo.
Videoconferências
- Ajustar o número de feeds de vídeo exibidos simultaneamente durante chamadas com muitos participantes.
- Reduza a qualidade do processamento de vídeo (resolução do vídeo, quadros por segundo).
- Ignorar o processamento de vídeo não essencial, como alguns filtros da câmera.
- Desative o processamento de áudio não essencial, como a supressão de ruído do WebRTC.
- Transforme botões de qualidade versus velocidade e tamanho versus velocidade em "velocidade" na codificação de vídeo e áudio (em WebRTC, WebCodecs ou codificação de software).
Videogames
- Use recursos de qualidade inferior para compor o vídeo do jogo (modelos 3D, texturas e shaders) e o áudio (vozes, efeitos sonoros).
- Desative efeitos que resultam em detalhes não essenciais menos realistas (água, animações de tecido, fogo, luminância da pele, efeitos de brilho ou simulações físicas que não afetam a jogabilidade).
- Ajuste os botões de qualidade e velocidade no mecanismo de renderização do jogo (qualidade de sombras, filtragem de texturas, distância de visualização).
Tecnicamente, isso pode ser feito conhecendo os estados térmicos (por exemplo, se o sistema está sendo resfriado passivamente) e os estados de pressão da CPU para a linha de execução principal e os workers que o site está usando. O estado térmico do sistema é global e pode ser afetado por apps e sites que não sejam o local de observação.
Interfaces
A API Compute Pressure pode ser executada nos seguintes contextos:
- Janela ou linha de execução principal
- Worker dedicado
- Worker compartilhado
A API Compute Pressure define duas novas interfaces.
PressureObserver
: um objeto para observar a pressão de computação de qualquer número de
fontes em um intervalo de amostragem predefinido. A primeira iteração no Chromium expõe
"cpu"
como source
. Consulte a seção sobre parâmetros para mais detalhes. Cada observador pode observar de forma assíncrona as tendências de mudanças de pressão em um
sistema.
PressureRecord
: descreve a tendência de pressão em um momento específico de transição. Os objetos desse tipo só podem ser acessados de duas maneiras: como uma entrada
para o callback PressureObserver ou chamando o método takeRecords()
na
instância PressureObserver
.
PressureObserver
Quando um objeto PressureObserver
é criado, ele é configurado para monitorar a
pressão das origens com suporte em um determinado intervalo de amostragem. As fontes com suporte
podem ser observadas ou não individualmente a qualquer momento durante a vida útil
do objeto PressureObserver
. Não é possível alterar o intervalo da amostra após a criação do objeto.
Construtor
PressureObserver(callback)
: cria um novo objeto PressureObserver
que invoca
uma função de callback especificada quando detecta que houve uma mudança nos valores
da origem observada.
O construtor usa uma função callback obrigatória.
Chamada de retorno
callback()
: o callback é chamado com uma matriz de objetos PressureRecord
não lidos.
Métodos
PressureObserver.observe(source, options)
: informa ao "PressureObserver" qual
fonte observar e options
opcional, como parâmetros.
Opções
PressureObserverOptions
: contém o intervalo de amostra, sampleInterval
em
milissegundos, em que o usuário solicita atualizações.
PressureObserver.unobserve(source)
: diz ao "PressureObserver" para parar
de observar uma origem.
PressureObserver.disconnect()
: informa ao PressureObserver para parar de observar
todas as origens.
PressureObserver.takeRecords()
: retorna uma sequência de registros
desde a última invocação de callback.
static PressureObserver.knownSources()
(somente leitura): retorna os tipos de origem conhecidos do user agent em ordem alfabética.
Parâmetros
source
: a origem a ser observada, por exemplo, "cpu"
. Precisa ser um dos
tipos de origem compatíveis.
Na versão atual da pressão de computação, somente "cpu"
é compatível.
PressureRecord
A interface PressureRecord
da API Compute Pressure descreve a tendência de pressão de uma fonte em um momento específico de transição.
Propriedades da instância
PressureRecord.source
(somente leitura): retorna uma string que representa a origem
de onde o registro vem.
PressureRecord.state
(somente leitura): retorna uma string que representa o estado
de pressão registrado.
PressureRecord.time
(somente leitura): retorna um número que representa um carimbo de data/hora de alta
resolução.
Exemplos
As seções a seguir listam exemplos de uso.
Determinar o suporte à API
if ('PressureObserver' in globalThis) {
// The Compute Pressure API is supported.
}
Criar um observador de pressão
Crie o observador de pressão chamando o construtor com uma função de callback para ser executada sempre que houver uma atualização de pressão:
const observer = new PressureObserver((records) => {
/* ... */
});
Uso do observador de pressão
Só há uma maneira de iniciar um observador de pressão. Para cada chamada de origem
observer.observe(source)
.
observer.observe("cpu" { sampleInterval: 2_000 });
Neste exemplo, "cpu"
é a fonte de pressão em que estamos interessados. Por
enquanto, é a única fonte disponível. No futuro, talvez haja outras fontes,
como "gpu"
, "power"
ou "thermals"
.
Um intervalo de amostra, sampleInterval
, de 2.000 ms significa que haverá
atualizações no máximo a cada dois segundos.
Se o intervalo de amostragem solicitado não puder ser atendido pelo sistema, ele vai fornecer amostras no intervalo mais adequado disponível. Por exemplo, se um intervalo de 2.000 ms for solicitado, mas o sistema só puder fornecer amostras de no máximo 1.000 ms, 1.000 ms será selecionado.
Para parar de observar uma origem, use o método unobserve()
, como no exemplo
abaixo:
observer.unobserve('cpu');
Para desobservar todas as fontes de uma só vez, use o método disconnect()
, como
no exemplo a seguir:
observer.disconnect();
Recuperar registros de pressão
Os registros de pressão podem ser recuperados com uma função de callback, que será invocada sempre que houver uma mudança no estado da pressão.
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 });
O usuário também pode forçar a leitura de PressureRecord
chamando o
método takeRecords()
.
O método takeRecords()
da interface PressureObserver
retorna uma matriz
de objetos PressureRecords
armazenados no observador de pressão, esvaziando-a.
O caso de uso mais comum para isso é buscar imediatamente todos os registros de pressão pendentes, ainda não processados pela função de callback do observador, antes de desconectar o observador. Assim, os registros pendentes podem ser processados ao encerrar o observador.
Chamar esse método limpa a lista de registros pendentes, para que o callback não seja executado.
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);
Envie feedback
Há algo na API que não funciona como esperado? Há algum método ou propriedade ausente no uso da API? Registre um problema de especificação ou comente um problema existente no repositório do GitHub correspondente.
Informar um problema com a implementação
Você encontrou um bug na implementação do Chromium? Ou a implementação é diferente da especificação? Registre um bug em new.crbug.com. Inclua o máximo de detalhes possível, instruções para reprodução e digite Blink>PerformanceAPIs>ComputePressure na caixa Components.
Recursos
- Especificações
- Explicação para o público
- Demonstração da API Compute Pressure | Fonte da demonstração da API Compute Pressure
- Bug de rastreamento do Chromium
- Entrada do ChromeStatus.com
- Componente Blink:
Blink>PerformanceAPIs>ComputePressure
- Revisão do TAG
- Pronto para o teste
- Página de INSTRUÇÕES
- Intenção de fazer experimentos