Вкладки, работающие в фоновом режиме, могут значительно снижать производительность браузера, особенно время работы от батареи. Чтобы решить эту проблему, в последние несколько лет Chrome ввел различные ограничения для фоновых вкладок. В последнее время мы предприняли ряд мер по дальнейшему улучшению, и в этом документе представлен обзор правил Chrome. В этом документе описаны действующие правила Chrome 57. Долгосрочная стратегия и дальнейшие планы описаны в этом документе.
Как оптимизировать приложение для работы в фоновом режиме
Веб-разработчикам следует помнить, что у пользователей часто открыто много вкладок в фоновом режиме, и это может серьезно повлиять на энергопотребление и время работы батареи. Фоновая работа должна быть сведена к минимуму, если она не является абсолютно необходимой для обеспечения определенного пользовательского опыта. Для определения того, когда страница находится в фоновом режиме, и приостановки всех ненужных действий, например визуальных обновлений, следует использовать Page Visibility API.
На некоторых сайтах эта простая оптимизация может снизить нагрузку на ЦП на 75 %.
var doVisualUpdates = true;
document.addEventListener('visibilitychange', function(){
doVisualUpdates = !document.hidden;
});
function update() {
if (!doVisualUpdates) {
return;
}
doStuff();
}
Правила
requestAnimationFrame()
Согласно документации, Chrome не вызывает requestAnimationFrame(), когда страница находится в фоновом режиме.
Такое поведение наблюдается с 2011 года.
Согласование фонового таймера
Начиная с Chrome 11, каждый независимый таймер запускается не чаще одного раза в секунду. Chrome запускает эти таймеры пакетами раз в секунду, чтобы свести к минимуму количество пробуждений процессов. Страницы, на которых воспроизводится звук, считаются видимыми для пользователя и не подлежат ограничению фоновых таймеров. Исключение действует в течение нескольких секунд после того, как воспроизведение аудио прекращается, чтобы приложения могли поставить в очередь следующий трек.
Обратите внимание, что аудио считается слышимым, только когда Chrome показывает значок аудио. Тихие аудиопотоки не дают права на исключение.
Ограничение фоновых таймеров на основе бюджета
В Chrome 57 появилась функция ограничения таймеров на основе бюджета, которая дополняет механизм выравнивания таймеров и позволяет дополнительно ограничить использование ЦП фоновыми таймерами. Вот как это работает:
- У каждой фоновой вкладки есть временной бюджет (в секундах) для работы таймеров в фоновом режиме.
- Ограничения по времени начинают действовать, если страница находится в фоновом режиме более 10 секунд.
- Задача таймера может выполняться, только если бюджет времени не отрицательный.
- После выполнения таймера время его работы вычитается из бюджета.
- Бюджет постоянно восстанавливается (в настоящее время со скоростью 0,01 секунды в секунду). Обратите внимание, что скорость восстановления бюджета может быть изменена, когда Chrome соберет больше данных о регулировании.
Существует ряд автоматических исключений из этого ограничения:
- Приложения, воспроизводящие аудио, считаются работающими в активном режиме и не ограничиваются.
- Приложения с подключениями в реальном времени (WebSocket и WebRTC), чтобы избежать закрытия этих подключений по истечении времени ожидания. В таких случаях правило run-timers-once-a-second все равно применяется.
Обратите внимание, что этот механизм использует реальное время, а не процессорное время. Это хорошая оценка времени работы процессора, которая учитывает блокировку основного потока на длительное время.
Наконец, помните, что если вы используете длительные задачи в фоновом режиме, ваше приложение может быть ограничено на очень длительный период времени (до 100 раз дольше, чем длится задача).
Разбейте работу на фрагменты по 50 мс или меньше в соответствии с рекомендациями по повышению производительности и используйте прослушиватель visibilityChange, чтобы избежать ненужной работы в фоновом режиме.
Отключено
В Chrome есть флаг --disable-background-timer-throttling, который можно использовать в таких случаях, как запуск наборов тестов и других ресурсоемких вычислений, разрешенных пользователем.