it-swarm-es.com

Chrome: tiempos de espera/intervalo suspendido en las pestañas de fondo?

Estaba probando la precisión de setTimeout usando esta prueba . Ahora me di cuenta de que (como se esperaba) setTimeout no es muy preciso, pero para la mayoría de los aparatos no es dramáticamente inexacto. Ahora, si ejecuto la prueba en Chrome y la dejo en una pestaña de fondo (así que, cambiando a otra pestaña y navego allí), volviendo a la prueba e inspeccionando los resultados (si la prueba terminó), se modifican drásticamente. Parece que los tiempos de espera han sido mucho más lentos. Probado en FF4 o IE9 esto no ocurrió.

Así que parece que Chrome suspende o al menos ralentiza la ejecución de javascript en una pestaña que no tiene foco. No se pudo encontrar mucho en la red sobre el tema. Significaría que no podemos ejecutar tareas en segundo plano, como, por ejemplo, verificar periódicamente en un servidor mediante llamadas XHR y setInterval (sospecho que para ver el mismo comportamiento para setInterval, escribiré una prueba si el tiempo está conmigo).

¿Alguien ha encontrado esto? ¿Habría una solución para esta suspensión/desaceleración? ¿Lo llamaría un error y debería archivarlo como tal?

114
KooiInc

Hace poco pregunté sobre esto y es el comportamiento por diseño. Cuando una pestaña está inactiva, solo una vez por segundo se llama a la función. Aquí está el cambio de código .

Quizás esto ayude: ¿Cómo puedo hacer que setInterval también funcione cuando una pestaña está inactiva en Chrome?

TL; DR: use Trabajadores web .

74
pimvdb

Existe una solución para usar Web Workers, porque se ejecutan en un proceso separado y no se ralentizan.

He escrito un pequeño script que puede usarse sin cambios en su código: simplemente reemplaza las funciones setTimeout, clearTimeout, setInterval, clearInterval

Solo inclúyelo antes de todo tu código

http://github.com/turuslan/HackTimer

20
Ruslan Tushov

La reproducción de un ~ sonido vacío obliga al navegador a conservar el rendimiento. Lo descubrí después de leer este comentario: ¿Cómo hacer que JavaScript se ejecute a una velocidad normal en Chrome incluso cuando la pestaña no está activa?

Necesito un rendimiento ilimitado a pedido para un juego de navegador que utiliza WebSockets, por lo que sé por experiencia que usar WebSockets no garantiza un rendimiento ilimitado, pero a partir de las pruebas, reproducir un archivo de audio parece garantizarlo.

Aquí hay 2 bucles de audio vacíos que creé para este propósito, puede usarlos libremente, comercialmente: http://adventure.land/sounds/loops/empty_loop_for_js_performance.ogghttp://adventure.land/sounds/ loops/empty_loop_for_js_performance.wav

(Incluyen ruido de -58db, -60db no funciona)

Los juego, a petición del usuario, con Howler.js: https://github.com/goldfire/howler.js

function performance_trick()
{
    if(sounds.empty) return sounds.empty.play();
    sounds.empty = new Howl({
        src: ['/sounds/loops/empty_loop_for_js_performance.ogg','/sounds/loops/empty_loop_for_js_performance.wav'],
        volume:0.5,
        autoplay: true, loop: true,
    });
}

Es triste que no haya un método incorporado para activar/desactivar el rendimiento completo de javascript de forma predeterminada; sin embargo, los criptógrafos pueden piratear todos sus subprocesos informáticos utilizando trabajadores web sin ningún tipo de solicitud: |

4
Kaan Soral

He lanzado worker-interval npm package que establece la implementación de InterInterval y clearInterval con el uso de Web-Workers para seguir funcionando en pestañas inactivas para Chrome, Firefox e IE.

La mayoría de los navegadores modernos (Chrome, Firefox e IE), los intervalos (temporizadores de ventana) están bloqueados para disparar no más de una vez por segundo en las pestañas inactivas.

Puedes encontrar más información en

https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setInterval

https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers#Timeouts_and_intervals

1
gorkemcnr

Actualicé mi núcleo de jQuery a 1.9.1, y resolví la discrepancia de intervalo en pestañas inactivas. Lo intentaría primero y luego buscaría otras opciones de anulación de código.

1
Carey Estes