Тест перший
Я написав тест спеціально для цієї мети:
Розподіл частоти кадрів: setInterval vs requestAnimationFrame
Примітка. Цей тест досить інтенсивний процесор. requestAnimationFrameне підтримується IE 9- та Opera 12-.
Тест реєструє фактичний час, який потрібно для роботи a setIntervalі requestAnimationFrameв різних браузерах, і дає результати у вигляді розподілу. Ви можете змінити кількість мілісекунд, setIntervalщоб побачити, як воно працює в різних налаштуваннях. setTimeoutпрацює аналогічно setIntervalвідносно затримок. requestAnimationFrameзазвичай за замовчуванням до 60 кадрів в секунду залежно від браузера. Щоб побачити, що відбувається, коли ви переходите на іншу вкладку або маєте неактивне вікно, просто відкрийте сторінку, перейдіть на іншу вкладку і почекайте деякий час. Він буде продовжувати фіксувати фактичний час, необхідний для виконання цих функцій, на неактивній вкладці.
Тест два
Ще один спосіб перевірити це, щоб увійти в мітку часу неодноразово з setIntervalі requestAnimationFrameпереглянути його в окремому консолі. Ви можете бачити, як часто воно оновлюється (або якщо воно коли-небудь оновлюється), коли ви робите вкладку чи вікно неактивними.
Результати
Chrome
Chrome обмежує мінімальний інтервал setIntervalприблизно до 1000 мс, коли вкладка неактивна. Якщо інтервал перевищує 1000 мс, він буде працювати на зазначеному інтервалі. Не має значення, якщо вікно не фокусується, інтервал обмежується лише при переході на іншу вкладку. requestAnimationFrameпризупиняється, коли вкладка неактивна.
// Provides control over the minimum timer interval for background tabs.
const double kBackgroundTabTimerInterval = 1.0;
https://codereview.chromium.org/6546021/patch/1001/2001
Firefox
Подібно до Chrome, Firefox обмежує мінімальний інтервал setIntervalприблизно до 1000 мс, коли вкладка (не вікно) неактивна. Однак requestAnimationFrameзапускається експоненціально повільніше, коли вкладка неактивна, кожен кадр займає значення 1s, 2s, 4s, 8s тощо.
// 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 не обмежує затримку, setIntervalколи вкладка неактивна, але робить паузу requestAnimationFrameна неактивних вкладках. Не має значення, вікно не в фокусі чи ні.
Край,
починаючи з краю 14, setIntervalмає обмеження в 1000 м на неактивних вкладках. requestAnimationFrameзавжди призупинено на неактивних вкладках.
Safari
Так само, як Chrome, Safari обмежується setIntervalв 1000 м, коли вкладка неактивна. requestAnimationFrameтакож призупинено.
Opera
З моменту створення двигуна Webkit, Opera проявляє таку ж поведінку, як і Chrome. setIntervalобмежується на 1000 мс і requestAnimationFrameпризупиняється, коли вкладка неактивна.
Підсумок
Повторення інтервалів для неактивних вкладок:
setInterval requestAnimationFrame
Chrome
9- не впливає, не підтримується
10 не вплинуло на паузу
11+> = 1000 мс призупинено
Firefox
3- не постраждало, не підтримується
4 не зачеплені 1с
5+> = 1000 мс 2 n s (n = кількість кадрів з моменту бездіяльності)
IE
9- не впливає, не підтримується
10+ не впливають на паузу
Край
13- не вплинуло на паузу
14+> = 1000 мс призупинено
Сафарі
5- не постраждали, не підтримуються
6 не вплинуло на паузу
7+> = 1000 мс призупинено
Опера
12- не впливає, не підтримується
15+> = 1000 мс призупинено