Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 22.07.2015, 10:03
Новичок на форуме
Отправить личное сообщение для piast Посмотреть профиль Найти все сообщения от piast
 
Регистрация: 14.04.2015
Сообщений: 7

При сворачивании окна браузера, останавливается выполнение скрипта.
Ситуация следующая: есть однооконное приложение(игра с вращающимися барабанами), которая штатно работает если вкладка браузера, в которой работает это приложение, не теряет фокуса. Но стоит свернуть окно браузера(либо переключится на другую вкладку), а потом вернуться обратно, то приложение останавливается. Причем происходит это не моментально, а через разные промежутки времени(от нескольких секунд до нескольких минут), и на одном и том же цикле вращения.
Подскажите пожалуйста в какую сторону копать для решения этой проблемы? Приму во внимание любые ответы.
Анимация построена с использованием requestAnimationFrame().

Последний раз редактировалось piast, 22.07.2015 в 10:07.
Ответить с цитированием
  #2 (permalink)  
Старый 22.07.2015, 13:05
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Значит в приложении это предусмотрено - стопориться при потере фокуса окном документа. Зачем ломать?

Ищите вроде такого (у меня так сделано)

W.addEventListener('focus',go);
		W.addEventListener('blur',stop);


То есть по словам focus и blur
Ответить с цитированием
  #3 (permalink)  
Старый 22.07.2015, 14:12
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

piast,
На видимой, но не активной вкладке типично замедляются все таймауты до секунды, рыть надо в сторону использования WEB Worker, процесс работает в фоновом режиме без ограничений по таймаутам, как на активной, так и на неактивной вкладке, исполнение яваскрипт на невидимых вкладках(поверх которых иная страница) браузера - приостанавливается. Тест активности/неактивности видимых вкладок удобно делать по:
document.visibilityState||document.webkitVisibilityState
Ответить с цитированием
  #4 (permalink)  
Старый 22.07.2015, 15:05
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Точно, жизнь упростилась с табами. Никто окна открывать не будет, а значит незачем проверять фокус. Таб же перекрывает другой таб целиком и полностью... цивилизация в опасности, или просто пена поднялась до браузеров?
Ответить с цитированием
  #5 (permalink)  
Старый 23.07.2015, 11:38
Новичок на форуме
Отправить личное сообщение для piast Посмотреть профиль Найти все сообщения от piast
 
Регистрация: 14.04.2015
Сообщений: 7

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) у меня идет обновление в несколько раздельных последовательных этапов. Переход на следующий этап выбирается в зависимости от того произошло ли какое-либо событие в игре. Так вот заметил, что остановка происходит на одном и том же этапе. И если следующий этап запускать "в ручную" вызовом соответствующего метода, то все продолжается и работает дальше как надо. Единственная проблема - игра может отработать несколько полных циклов, проходя все этапы и в неактивной вкладке, а потом в какой-то случайный момент тормознуться.
Ответить с цитированием
  #6 (permalink)  
Старый 23.07.2015, 12:25
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

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);
}
Ответить с цитированием
  #7 (permalink)  
Старый 23.07.2015, 15:02
Новичок на форуме
Отправить личное сообщение для piast Посмотреть профиль Найти все сообщения от piast
 
Регистрация: 14.04.2015
Сообщений: 7

рони, интересная ситуация, с performance.now() стало работать стабильнее. Остановки все равно случаются, но теперь в несколько раз реже

Последний раз редактировалось piast, 23.07.2015 в 15:04.
Ответить с цитированием
  #8 (permalink)  
Старый 23.07.2015, 16:52
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

piast,
Перерисовки на неактивной вкладке очевидно по таймауту setInterval и setTimeout, дык в большинстве браузеров минимальное время таймаута на неактивных вкладках замедляется до секунды. Есть какие то хаки, типо сделать 10 секундных таймеров с разницей начального запуска в 100ms, кликающих скрытый элемент, а по событию клика получаем 100ms таймер, но суть в том что начальное смещениние этих таймеров с течением времени будет мигрировать и все они могут слиться в один клик
Ответить с цитированием
  #9 (permalink)  
Старый 24.07.2015, 10:04
Новичок на форуме
Отправить личное сообщение для piast Посмотреть профиль Найти все сообщения от piast
 
Регистрация: 14.04.2015
Сообщений: 7

Deff,
Так отож, хотелось бы найти такое решение, которое не будет создавать своих проблем.
Ответить с цитированием
  #10 (permalink)  
Старый 24.07.2015, 11:19
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

piast,
Ну делать функцию интервала с помощью WEB Worker, передавать ему параметр интервала и он своими событиями postMessage по своему независимому от активности вкладки интервалу будет вызывать функцию отрисовки уже на странице,

Последний раз редактировалось Deff, 24.07.2015 в 11:22.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменение размера окна браузера pv! Общие вопросы Javascript 10 29.09.2019 08:45
вызов функции при закритти окна браузера zerofx Events/DOM/Window 4 14.05.2015 10:37
Выполнение скрипта при открытии ссылки с параметром infernorays Общие вопросы Javascript 22 12.06.2013 21:18
Инициализация плагина при изменении размеров окна браузера prison47 jQuery 12 02.04.2013 03:45
Реклама по центру окна браузера Макс Элементы интерфейса 2 15.06.2008 00:55