Тест Один
Я написал тест специально для этой цели:
Распределение частоты кадров: 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 ограничивается setInterval1000 мс, когда вкладка неактивна. 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 мс приостановлено