Prueba uno
He escrito una prueba específicamente para este propósito:
Distribución de velocidad de cuadros: setInterval vs requestAnimationFrame
Nota: Esta prueba requiere bastante CPU. requestAnimationFrame
no es compatible con IE 9 y Opera 12.
La prueba registra el tiempo real que se necesita para una setInterval
y requestAnimationFrame
para funcionar en distintos navegadores, y le da los resultados en forma de una distribución. Puede cambiar el número de milisegundos para setInterval
ver cómo se ejecuta en diferentes configuraciones. setTimeout
funciona de manera similar a a setInterval
con respecto a los retrasos. requestAnimationFrame
generalmente está predeterminado a 60 fps según el navegador. Para ver qué sucede cuando cambia a una pestaña diferente o tiene una ventana inactiva, simplemente abra la página, cambie a una pestaña diferente y espere un momento. Continuará registrando el tiempo real que lleva estas funciones en una pestaña inactiva.
Prueba dos
Otra forma de probarlo es registrar la marca de tiempo repetidamente con setInterval
y requestAnimationFrame
y verlo en una consola separada. Puede ver con qué frecuencia se actualiza (o si alguna vez se actualiza) cuando desactiva la pestaña o ventana.
Resultados
Chrome
Chrome limita el intervalo mínimo de setInterval
alrededor de 1000 ms cuando la pestaña está inactiva. Si el intervalo es superior a 1000 ms, se ejecutará en el intervalo especificado. No importa si la ventana está desenfocada, el intervalo se limita solo cuando cambia a una pestaña diferente. requestAnimationFrame
está en pausa cuando la pestaña está inactiva.
// Provides control over the minimum timer interval for background tabs.
const double kBackgroundTabTimerInterval = 1.0;
https://codereview.chromium.org/6546021/patch/1001/2001
Firefox
Similar a Chrome, Firefox limita el intervalo mínimo de setInterval
alrededor de 1000 ms cuando la pestaña (no la ventana) está inactiva. Sin embargo, se requestAnimationFrame
ejecuta exponencialmente más lento cuando la pestaña está inactiva, con cada cuadro tomando 1s, 2s, 4s, 8s y así sucesivamente.
// The default shortest interval/timeout we permit
#define DEFAULT_MIN_TIMEOUT_VALUE 4 // 4ms
#define DEFAULT_MIN_BACKGROUND_TIMEOUT_VALUE 1000 // 1000ms
https://hg.mozilla.org/releases/mozilla-release/file/0bf1cadfb004/dom/base/nsGlobalWindow.cpp#l296
Internet Explorer
IE no limita el retraso setInterval
cuando la pestaña está inactiva, pero se detiene requestAnimationFrame
en pestañas inactivas. No importa si la ventana está desenfocada o no.
Edge
Comenzando desde Edge 14, setInterval
tiene un límite de 1000 ms en pestañas inactivas. requestAnimationFrame
siempre está en pausa en pestañas inactivas.
Safari
Al igual que Chrome, Safari se setInterval
limita a 1000 ms cuando la pestaña está inactiva. requestAnimationFrame
está en pausa también.
Opera
Desde la adopción del motor Webkit, Opera exhibe el mismo comportamiento que Chrome. setInterval
tiene un límite de 1000 ms y requestAnimationFrame
se detiene cuando la pestaña está inactiva.
Resumen
Repetir intervalos para pestañas inactivas:
setInterval requestAnimationFrame
Chrome
9- no afectado no soportado
10 no afectados en pausa
11+> = 1000 ms en pausa
Firefox
3- no afectado no soportado
4 no afectados 1s
5+> = 1000ms 2 n s (n = número de cuadros desde inactividad)
ES DECIR
9- no afectado no soportado
10+ no afectados en pausa
Borde
13- no afectado en pausa
14+> = 1000 ms en pausa
Safari
5- no afectado no soportado
6 no afectados en pausa
7+> = 1000 ms en pausa
Ópera
12- no afectado no soportado
15+> = 1000 ms en pausa
setInterval
/setTimeout
veces por debajo de 1000 ms se cambian a 1000 ms cuando la pestaña / ventana está borrosasetInterval
/setTimeout
times under 1000ms se cambian a 1000ms cuando la pestaña / ventana está borrosa. No está claro lo que ha intentado transmitir