Cómo los sitios web desperdician CPU y batería
(h.43z.one)-
Descubrimiento del problema: En una laptop nueva se detectó un problema de ruido blanco intermitente en los altavoces. Solo se podía oír en una habitación silenciosa.
-
Análisis de la causa: Tras revisar el estado del audio sink de PulseAudio, se descubrió que no había sonido en estado SUSPENDED, pero en estado IDLE o RUNNING sí aparecía el ruido blanco.
-
El problema de Firefox: Firefox aparecía como el programa que estaba usando el audio sink, y el ruido blanco ocurría aunque ninguna de las pestañas abiertas estuviera reproduciendo sonido.
-
La causa: Se descubrió que el sonido de notificaciones de outlook.office.com era el origen del problema. Cada vez que llegaba un correo, comenzaba el ruido blanco, y solo se detenía al recargar la pestaña o reiniciar Firefox.
-
Consumo de batería: Cuando aparecía el ruido blanco, aumentaba el consumo de CPU y batería.
-
Intento de solución: Se intentó resolver el problema desactivando las notificaciones de correo, pero en otros sitios web ocurrían problemas similares.
-
Procesamiento de audio en HTML/JavaScript: Hay dos formas de reproducir audio: la etiqueta `` y la API WebAudio. Se confirmó que la causa del problema ocurre al crear un AudioContext.
-
Diferencia entre Firefox y Chrome: Chrome deja de desperdiciar batería/CPU automáticamente después de cierto tiempo, pero Firefox no lo hace.
-
Solución: Se desarrolló una extensión que detiene automáticamente AudioContext y lo reinicia cuando es necesario. No es perfecta, pero funciona lo suficientemente bien.
1 comentarios
Opiniones de Hacker News
Este problema está planificado y es importante. Se resolverá pronto. Pido disculpas porque aún no se ha solucionado por un tema de prioridades. Personalmente, tiene alta prioridad
Un sitio web que abre un contexto de audio y no reproduce nada probablemente esté haciendo detección de bots
Me pregunto si el mismo problema también ocurre en dispositivos Android
Este ruido blanco me volvió loco durante mucho tiempo, pero no pude rastrearlo
Cuando la salida queda inactiva, la señal digital SPDIF pierde la sincronización. Cuando empieza la reproducción, tarda un tiempo en volver a sincronizarse, y se pierden los primeros segundos del audio. Escribí un programa que mantiene la salida abierta sin volcar datos en la línea para evitar que la salida quede inactiva
Esto podría explicar un problema en Android Firefox, donde a veces mi teléfono consumía 10 GB de datos al día. Un sitio de noticias reproducía audio y recargaba anuncios repetidamente, y la pestaña no entraba en modo de ahorro de energía por el audio. Tuve que cambiarme a Chrome por los cargos recurrentes de datos
En Chromium, el código que maneja esta interrupción está aquí
suspend/resumemencionada en el artículoTambién encontré un problema parecido en macOS (consumo de energía inducido por audio, sin ruido blanco)
coreaudioden mi Mac está usando el 20% del CPU aunque no esté reproduciendo nada. Pienso cambiarme a otro navegador hasta que se resuelva este problema, pero no quiero abandonar FirefoxEste problema corrigió la primera página de https://www.dr.dk/
No sé bien cómo está implementado
audioContext, pero es muy inteligente y dinámico. Reproducir un sonido de notificación es como dibujar SVG con D3. Me pregunto si existe algún hook deserviceWorkeren una API más eficiente para registrar tareas repetitivas simples, como un manejador de notificaciones