我目前正在使用 WebRTC 在 JavaScript 中开发一个点对点游戏。它将其中一个对等点(即主机)视为服务器,而任何其他加入的对等点则通过 Node.js 代理服务器连接到主机。
我目前正在尝试解决以下问题:如果主机切换选项卡以使游戏不再是活动选项卡,则游戏会停止为所有人更新。经过一些研究后,我发现这是因为我正在使用类似的东西:
setTimeout(callback, 1000 / 60);
在我的游戏循环中。 setTimeout(至少在我关心的浏览器 Chrome 和 Firefox 中)的定义是,如果调用它的页面不在您的活动选项卡中,则每秒最多可以调用一次。
我读到 Web Workers 没有这个限制,但为了实现这一点,我需要在 Web Workers 中运行所有游戏逻辑。我尝试使用 JSON.stringify() 将游戏对象发送给工作人员,但它说该对象有循环引用(在游戏循环中),并且无法转换为 JSON。所以我不知道该怎么办。
我还考虑实现自己的计时器,无论页面是否位于活动选项卡中,该计时器都会继续运行,但我也不知道如何执行此操作。
只要不会产生很大的性能开销,我用这些方法,甚至是我还没有想到的其他方法都没有问题。任何建议将不胜感激。
因此,正如我上面所说,Web Workers 能够调用 setTimeout(),对于非活动选项卡不会有 1 秒的延迟。我的解决方案是创建一个 Web Worker,它只负责调用 setTimeout() (在其 onmessage 事件侦听器中调用)。然后,在每个游戏循环结束时我调用:
this.worker.postMessage(null)
可能有人会说,赋予 Web Worker 更多责任比仅仅调用 setTimeout() 更有效,因为我已经添加了等待主线程和工作线程之间发送消息的开销。这是我将来可能会考虑的事情。
这样做的主要问题是与 IE 的兼容性; IE 直到 10.0 版本才获得对 Web Worker 的支持。这对我来说并不是真正关心的问题,但我认为值得一提。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)