При сворачивании окна браузера, останавливается выполнение скрипта.
Ситуация следующая: есть однооконное приложение(игра с вращающимися барабанами), которая штатно работает если вкладка браузера, в которой работает это приложение, не теряет фокуса. Но стоит свернуть окно браузера(либо переключится на другую вкладку), а потом вернуться обратно, то приложение останавливается. Причем происходит это не моментально, а через разные промежутки времени(от нескольких секунд до нескольких минут), и на одном и том же цикле вращения.
Подскажите пожалуйста в какую сторону копать для решения этой проблемы? Приму во внимание любые ответы. Анимация построена с использованием requestAnimationFrame(). |
Значит в приложении это предусмотрено - стопориться при потере фокуса окном документа. Зачем ломать?
Ищите вроде такого (у меня так сделано) W.addEventListener('focus',go); W.addEventListener('blur',stop); То есть по словам focus и blur |
piast,
На видимой, но не активной вкладке типично замедляются все таймауты до секунды, рыть надо в сторону использования WEB Worker, процесс работает в фоновом режиме без ограничений по таймаутам, как на активной, так и на неактивной вкладке, исполнение яваскрипт на невидимых вкладках(поверх которых иная страница) браузера - приостанавливается. Тест активности/неактивности видимых вкладок удобно делать по: document.visibilityState||document.webkitVisibilityState |
Точно, жизнь упростилась с табами. Никто окна открывать не будет, а значит незачем проверять фокус. Таб же перекрывает другой таб целиком и полностью... цивилизация в опасности, или просто пена поднялась до браузеров?
|
var lastTime = Date.now(); function main() { var now = Date.now(); var dt = Math.min((now - lastTime), 20) / 1000.0; update(dt); render(); lastTime = now; requestAnimationFrame(main); } В функции update(dt) у меня идет обновление в несколько раздельных последовательных этапов. Переход на следующий этап выбирается в зависимости от того произошло ли какое-либо событие в игре. Так вот заметил, что остановка происходит на одном и том же этапе. И если следующий этап запускать "в ручную" вызовом соответствующего метода, то все продолжается и работает дальше как надо. Единственная проблема - игра может отработать несколько полных циклов, проходя все этапы и в неактивной вкладке, а потом в какой-то случайный момент тормознуться. |
piast,
на всякий случай var lastTime = performance.now(); function main(time) { var dt = Math.min((time - lastTime), 20) / 1000.0; update(dt); render(); lastTime = performance.now(); requestAnimationFrame(main); } |
рони, интересная ситуация, с performance.now() стало работать стабильнее. Остановки все равно случаются, но теперь в несколько раз реже
|
piast,
Перерисовки на неактивной вкладке очевидно по таймауту setInterval и setTimeout, дык в большинстве браузеров минимальное время таймаута на неактивных вкладках замедляется до секунды. Есть какие то хаки, типо сделать 10 секундных таймеров с разницей начального запуска в 100ms, кликающих скрытый элемент, а по событию клика получаем 100ms таймер, но суть в том что начальное смещениние этих таймеров с течением времени будет мигрировать и все они могут слиться в один клик |
Deff,
Так отож, хотелось бы найти такое решение, которое не будет создавать своих проблем. |
piast,
Ну делать функцию интервала с помощью WEB Worker, передавать ему параметр интервала и он своими событиями postMessage по своему независимому от активности вкладки интервалу будет вызывать функцию отрисовки уже на странице, |
Часовой пояс GMT +3, время: 08:29. |