Тест перший
Я написав тест спеціально для цієї мети:
Розподіл частоти кадрів: 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 мс призупинено