Informe-se 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. Ele permite que a implementação use as métricas de hardware subjacentes corretas para garantir que os usuários possam aproveitar toda a capacidade de processamento disponível, desde que o sistema não esteja sob estresse impossível de gerenciar.
Status atual
Step | Status |
---|---|
1. Criar explicação | Concluído |
2. Criar rascunho inicial da especificação | Concluído |
3. Reunir feedbacks e iterar no design | Em andamento |
4. Teste de origem | Completos |
5. Lançamento | Concluído (Chrome 125) |
Testar a API Compute Pressure
Para testar a API Compute Pressure localmente, leia esta página.
Registrar-se no teste de origem
No Chrome 115, a API Compute Pressure está disponível como um teste de origem. Ela vai terminar no Chrome 123 (29 de maio de 2024). Inscreva-se aqui.
Casos de uso
Os principais casos de uso aprimorados pela API Compute Pressure atual são videoconferências e videogames.
Esses aplicativos conhecidos em tempo real são classificados como soft. Ou seja, a qualidade do serviço diminui se o sistema for exercido 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 da capacidade de adaptar as cargas de trabalho com base no consumo ou na pressão da CPU.
Especificamente, a primeira versão dessa API tem como objetivo permitir as seguintes decisões de adaptação.
Videoconferência
- Ajuste 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 de vídeo, quadros por segundo).
- Pule o processamento de vídeos não essenciais, como alguns filtros de câmera.
- Desative o processamento de áudio não essencial, como a supressão de ruído WebRTC.
- Mude os botões de qualidade versus velocidade e tamanho versus velocidade em "velocidade" em codificação de vídeo e áudio (em WebRTC, WebCodecs ou codificação de software).
Videogames
- Use recursos de qualidade mais baixa para compor o vídeo (modelos 3D, texturas, sombreadores) e o áudio (vozes e efeitos sonoros) do jogo.
- Desative efeitos que resultem em detalhes não essenciais menos realistas, como água, tecido, animações de fogo, luminância da pele, efeitos de reflexo ou simulações físicas que não afetem a jogabilidade.
- Ajustes de qualidade versus velocidade no mecanismo de renderização do jogo (qualidade de sombras, filtragem de textura, distância de visualização).
Tecnicamente, isso pode ser feito sabendo os estados térmico (por exemplo, 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 diferentes do local de observação.
Interfaces
A API Compute Pressure pode ser executada nos seguintes contextos:
- Linha de execução principal ou da janela
- 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 origens em um
intervalo de amostra 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 maneira 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. Objetos desse
tipo só podem ser recebidos de duas maneiras: como uma entrada para o callback do PressureObserver ou chamando
o método takeRecords()
na instância PressureObserver
.
PressureObserver
Quando um objeto PressureObserver
é criado, ele é configurado para observar a pressão das fontes com suporte, em um determinado intervalo de amostra. As fontes com suporte podem ser observadas individualmente ou não
observadas a qualquer momento durante o ciclo de vida do objeto PressureObserver
. Não é possível alterar o intervalo da amostra após a criação do objeto.
Construtor
PressureObserver(callback, options)
: cria um novo objeto PressureObserver
que vai invocar uma
função de callback especificada quando detectar que ocorreu uma mudança nos valores da origem
que está sendo observada.
O construtor usa uma função de callback obrigatória e opções opcionais, como parâmetros.
Chamada de retorno
callback()
: o callback é chamado com uma matriz de objetos PressureRecord
não lidos.
Opções
PressureObserverOptions
: contém o intervalo de amostra,sampleInterval
em milissegundos, em que o usuário solicita
atualizações.
Métodos
PressureObserver.observe(source)
: informa ao "PressureObserver" qual fonte observar.
PressureObserver.unobserve(source)
: instrui o "PressureObserver" a parar de observar uma fonte.
PressureObserver.disconnect()
: instrui o "PressureObserver" a parar de observar todas as fontes.
PressureObserver.takeRecords()
: retorna uma sequência de registros, desde a última invocação do callback.
static PressureObserver.supportedSources()
(somente leitura): retorna os tipos de origem compatíveis com o hardware.
Parâmetros
source
: a fonte a ser observada, por exemplo, "cpu"
. Precisa ser um dos tipos de origem compatíveis.
Na versão atual do Compute Pressure, apenas "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 fonte de origem do registro.
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
A API Compute Pressure é compatível?
if ('PressureObserver' in globalThis) {
// The Compute Pressure API is supported.
}
Como criar um observador de pressão
Crie o observador de pressão chamando o construtor com uma função de callback a ser executada sempre que houver uma atualização de pressão:
const observer = new PressureObserver(
(records) => { /* ... */ },
{ sampleInterval: 2000 }
);
Um intervalo de amostra, sampleInterval
, de 2.000 ms significa que haverá atualizações a cada dois segundos, no máximo.
Se o intervalo de amostra solicitado não puder ser veiculado pelo sistema. O sistema fornecerá amostras no melhor intervalo adequado atual. Por exemplo, se o intervalo de 2.000 ms for solicitado, mas o sistema só puder fornecer amostras de, no máximo, 1.000 ms, serão selecionados 1.000 ms.
Como usar um observador de pressão
Há apenas uma maneira de iniciar um observador de pressão. Para cada chamada de origem, chame
observer.observe(source)
.
observer.observe("cpu");
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"
.
Para parar de observar uma origem, use o método unobserve()
, como no exemplo a seguir:
observer.unobserve("cpu");
Para deixar de observar todas as fontes de uma só vez, use o método disconnect()
, como no exemplo a seguir:
observer.disconnect();
Como recuperar registros de pressão
Os registros de pressão podem ser recuperados com uma função de callback, que é invocada sempre que uma mudança acontece no estado de 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, { sampleInterval: 1000 });
await observer.observe("cpu");
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, para que todos os registros pendentes possam ser processados ao desligar o observador.
Chamar esse método limpa a lista de registros pendentes, portanto, o retorno de chamada não será executado.
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);
Fale sobre o design da API
Há algo na API que não funciona como esperado? Há algum método ou propriedade ausente para o uso da API? Registre um problema específico ou comente sobre 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 simples para reprodução e digite Blink>PerformanceAPIs>ComputePressure na caixa Componentes.
Links úteis
- Especificações
- Explicações públicas
- Demonstração da API Compute Pressure | Fonte da demonstração da API Compute Pressure
- Bug de rastreamento do Chromium
- Entrada ChromeStatus.com
- Componente Blink:
Blink>PerformanceAPIs>ComputePressure
- Análise da TAG
- Pronto para teste
- página TUTORIAL
- Intenção de fazer experimentos