Como os websites desperdiçam CPU e bateria
(h.43z.one)-
Descoberta do problema: Foi identificado em um notebook novo um problema de ruído branco intermitente saindo dos alto-falantes. Só era possível ouvir em um ambiente silencioso.
-
Análise da causa: Ao verificar o estado do sink de áudio do PulseAudio, foi constatado que não havia som no estado
SUSPENDED, mas que o ruído branco ocorria nos estadosIDLEouRUNNING. -
Problema no Firefox: O Firefox aparecia como o programa que estava usando o sink de áudio, e o ruído branco ocorria mesmo sem nenhuma aba aberta reproduzindo som.
-
Causa: Descobriu-se que o som de notificação do outlook.office.com era a causa do problema. Sempre que um e-mail chegava, o ruído branco começava e só parava ao recarregar a aba ou reiniciar o Firefox.
-
Consumo de bateria: Quando o ruído branco ocorria, o consumo de CPU e bateria aumentava.
-
Tentativa de solução: Tentou-se resolver o problema desativando as notificações de e-mail, mas problemas semelhantes também aconteciam em outros websites.
-
Processamento de áudio em HTML/JavaScript: Há a tag `` e a WebAudio API como formas de reproduzir áudio. Foi confirmado que a causa do problema ocorre ao criar um
AudioContext. -
Diferença entre Firefox e Chrome: O Chrome interrompe automaticamente o desperdício de bateria/CPU depois de certo tempo, mas o Firefox não.
-
Solução: Foi desenvolvida uma extensão que interrompe automaticamente o
AudioContexte o reinicia quando necessário. Não é perfeita, mas é eficaz o suficiente.
1 comentários
Comentários do Hacker News
Esse problema é conhecido e importante. Deve ser resolvido em breve. Pedem desculpas por ainda não ter sido corrigido por uma questão de prioridade. Pessoalmente, é uma prioridade alta
Um site que abre um contexto de áudio e não reproduz nada provavelmente está fazendo detecção de bots
Fico curioso se o mesmo problema também acontece em dispositivos Android
Esse ruído branco me deixou maluco por muito tempo, mas eu não conseguia rastrear a origem
Quando a saída fica ociosa, o sinal digital SPDIF perde a sincronização. Quando a reprodução começa, ele volta a sincronizar, mas isso leva tempo, e você perde os primeiros segundos do áudio. Já escrevi um programa que mantém a saída aberta sem despejar dados na linha para evitar que a saída fique ociosa
Isso talvez explique um problema no Firefox para Android em que, às vezes, o celular consumia 10 GB de dados por dia. Um site de notícias reproduzia áudio e recarregava anúncios repetidamente, e a aba não entrava em modo de economia de energia por causa do áudio. Tive que mudar para o Chrome por causa das cobranças recorrentes de dados
No Chromium, o código que lida com essa interrupção está aqui
Também notei um problema parecido no macOS (consumo de energia induzido por áudio, sem ruído branco)
coreaudioddo Mac está usando 20% da CPU mesmo sem reproduzir nada. Estou pensando em mudar para outro navegador até isso ser corrigido, mas não quero abandonar o FirefoxEsse problema corrige a página inicial de https://www.dr.dk/
Não entendo bem como o
audioContexté implementado, mas ele é muito inteligente e dinâmico. Reproduzir um som de notificação é como desenhar SVG com D3. Fico pensando se existe algum hook deserviceWorkerem uma API mais eficiente que permita registrar tarefas repetitivas simples, como um manipulador de notificações