Тест Один
Я написал тест специально для этой цели:
Распределение частоты кадров: setInterval vs requestAnimationFrame
Примечание. Этот тест требует значительных ресурсов процессора. requestAnimationFrame
не поддерживается IE 9- и Opera 12-.
Тест регистрирует фактическое время, необходимое для выполнения setInterval
и requestAnimationFrame
в разных браузерах, и выдает результаты в виде дистрибутива. Вы можете изменить количество миллисекунд, setInterval
чтобы увидеть, как он работает при разных настройках. setTimeout
работает аналогично a в setInterval
отношении задержек. requestAnimationFrame
как правило, по умолчанию 60fps в зависимости от браузера. Чтобы увидеть, что происходит, когда вы переключаетесь на другую вкладку или у вас неактивное окно, просто откройте страницу, переключитесь на другую вкладку и подождите некоторое время. Он продолжит регистрировать фактическое время, необходимое для этих функций, на неактивной вкладке.
Тест Два
Другой способ проверить это состоит в том, чтобы периодически регистрировать метку времени 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
когда вкладка неактивна , она работает экспоненциально медленнее, каждый кадр занимает 1 с, 2 с, 4 с, 8 с и т. Д.
// 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
в неактивных вкладках. Неважно, не в фокусе ли окно.
Edge
Начиная с Edge 14, setInterval
ограничивается 1000 мс в неактивных вкладках. requestAnimationFrame
всегда приостанавливается в неактивных вкладках.
Safari
Как и Chrome, Safari ограничивается setInterval
1000 мс, когда вкладка неактивна. requestAnimationFrame
также приостановлен
Opera
С момента принятия движка Webkit Opera демонстрирует то же поведение, что и Chrome. setInterval
ограничивается 1000 мс и requestAnimationFrame
приостанавливается, когда вкладка неактивна.
Резюме
Повторяющиеся интервалы для неактивных вкладок:
setInterval requestAnimationFrame
Chrome
9 - не влияет, не поддерживается
10 без изменений приостановлено
11+> = 1000 мс приостановлено
Fire Fox
3- не влияет не поддерживается
4 не влияет 1с
5+> = 1000 мс 2 н S (N = число кадров с момента бездействия)
IE
9 - не влияет, не поддерживается
10+ не влияет на паузу
край
13- не влияет на паузу
14+> = 1000 мс приостановлено
Сафари
5- не влияет не поддерживается
6 не влияет на паузу
7+> = 1000 мс приостановлено
опера
12 - не влияет, не поддерживается
15+> = 1000 мс приостановлено