В настоящее время я разрабатываю одноранговую игру на JavaScript с использованием WebRTC. Он рассматривает один из одноранговых узлов (то есть хост) как сервер, а любые другие одноранговые узлы, которые присоединяются, подключаются к узлу через посреднический сервер node.js.
В настоящее время я пытаюсь решить проблему, из-за которой игра перестает обновляться для всех, если хост переключает вкладки, так что игра больше не является активной вкладкой. Проведя небольшое исследование, я обнаружил, что это потому, что я использую что-то вроде:
setTimeout(callback, 1000 / 60);
в моем игровом цикле. setTimeout (по крайней мере, в Chrome и Firefox, которые являются браузерами, которые меня интересуют) определяется таким образом, что если вызывающая его страница не находится на вашей активной вкладке, ее можно вызывать максимум один раз в секунду.
Я читал, что у веб-воркеров нет этого ограничения, но для того, чтобы это работало, мне нужно было бы запустить всю мою игровую логику внутри веб-воркера. Я попытался отправить свой игровой объект рабочему с помощью JSON.stringify (), но он сказал, что объект имеет круговую ссылку (в игровом цикле) и его нельзя преобразовать в JSON. Так что я не уверен, что с этим делать.
Я также рассмотрел возможность реализации своего собственного таймера, который продолжал работать независимо от того, была ли страница на активной вкладке, но я тоже не знаю, как это сделать.
У меня действительно нет проблем с тем, чтобы сделать это любым из этих способов или даже каким-то другим способом, о котором я еще не думал, при условии, что это не влечет за собой больших накладных расходов на производительность. Любые предложения будут ценны.
importScripts
). В качестве альтернативы вы можете использовать worker для отправки сообщений по таймеру, поскольку у них нет этого ограничения, и использовать функцию обратного вызова в качестве обработчика событий. - person Benjamin Gruenbaum   schedule 04.05.2014