Chrome: тайм-ауты / интервал приостановлены в фоновых вкладках?
Я проверял точность setTimeout
используя этот тест. Теперь я заметил, что (как и ожидалось) setTimeout
не очень точно, но для большинства приборов не резко неточным. Теперь, если я запускаю тест в Chrome и позволяю ему работать на фоновой вкладке (так, переключаясь на другую вкладку и просматривая там), возвращаясь к тесту и проверяя результаты te (если тест завершен), они резко меняются. Похоже, что тайм-ауты работают намного медленнее. Испытания в FF4 или IE9 этого не произошло.
таким образом, похоже, что Chrome приостанавливает или, по крайней мере, замедляет выполнение javascript на вкладке, которая не имеет фокуса. Не смог найти много в сети по этому вопросу. Это означало бы, что мы не можем запускать фоновые задачи, например, периодически проверять сервер с помощью вызовов XHR и setInterval
(Я подозреваю, что вижу такое же поведение для setInterval
, напишу тест, если время со мной).
кто-нибудь сталкивался с этим? Будет ли там обходной путь для эта подвеска / замедление? Вы бы назвали это ошибкой, и я должен подать его как таковой?
5 ответов:
Я недавно спросил об этом и это поведение по дизайну. Если вкладка неактивна, функция вызывается не чаще одного раза в секунду. Вот это изменить код.
возможно, это поможет: как я могу сделать setInterval также работать, когда вкладка неактивна в Chrome?
TL; DR: использовать Веб-Работников.
существует решение для использования веб-работников, потому что они работают в отдельном процессе и не замедляются
Я написал крошечный скрипт, который можно использовать без изменений в коде - он просто переопределяет функции setTimeout, clearTimeout, setInterval, clearInterval
просто включите его перед всем вашим кодом
я обновил ядро jQuery до 1.9.1, и это решило несоответствие интервала в неактивных вкладках. Я бы сначала попробовал это, а затем посмотрел на другие параметры переопределения кода.
Я выпустил рабочий-интервал пакет npm, который устанавливает реализацию setInterval и clearInterval с использованием веб-работников для поддержания и запуска на неактивных вкладках для Chrome, Firefox и IE.
большинство современных браузеров (Chrome, Firefox и IE), интервалы (оконные таймеры) зажимаются для запуска не чаще одного раза в секунду в неактивных вкладках.
вы можете найти более подробную информацию на
https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setInterval
воспроизведение ~пустой звук заставляет браузер сохранять производительность - я обнаружил это после прочтения этого комментария:Как заставить JavaScript работать с нормальной скоростью в Chrome, даже если вкладка не активна?
Мне нужна неограниченная производительность по требованию для браузерной игры, которая использует WebSockets, поэтому я знаю по опыту, что использование WebSockets не обеспечивает неограниченную производительность, но из тестов воспроизведение аудиофайла, похоже, гарантирует это
вот 2 пустых аудио петли я создал для этой цели, вы можете использовать их свободно, коммерчески: http://adventure.земля / звуки / петли / empty_loop_for_js_performance.ogg http://adventure.земля / звуки / петли / empty_loop_for_js_performance.wav
(они включают-58db шум, - 60db не работает)
Я играю их, по требованию пользователя, с ревуном.js:https://github.com/goldfire/howler.js
function performance_trick() { if(sounds.empty) return sounds.empty.play(); sounds.empty = new Howl({ src: ['/sounds/loops/empty_loop_for_js_performance.ogg','/sounds/loops/empty_loop_for_js_performance.wav'], volume:0.5, autoplay: true, loop: true, }); }
грустно, что нет встроенного метод для включения/выключения полной производительности javascript по умолчанию, но крипто-майнеры могут захватить все ваши вычислительные потоки с помощью веб-работников без каких-либо подсказок :|