我目前正在使用WebRTC在JavaScript中开发一个点对点游戏。它将其中一个对等体(即主机)视为服务器,并将任何其他加入的对等体视为通过node.js代理服务器连接到主机。
我正在尝试解决游戏停止为每个人更新的问题,如果主机切换标签使得游戏不再是活动标签。在做了一些研究之后,我发现这是因为我使用了类似的东西:
setTimeout(callback, 1000 / 60);
在我的游戏循环中。 setTimeout(至少在Chrome和Firefox中,我所关注的浏览器)的定义是,如果调用它的页面不在您的活动标签中,则每秒最多可调用一次。
我读到Web Workers没有这个约束,但是为了完成这项工作,我需要在web worker中运行我的所有游戏逻辑。我尝试使用JSON.stringify()将我的游戏对象发送给worker,但是它说该对象有一个循环引用(在游戏循环中)并且它不能转换为JSON。所以我不知道该怎么做。
我还研究了实现自己的计时器,无论页面是否在活动标签中,它都会继续运行,但我也不确定如何执行此操作。
我没有遇到任何问题,或者甚至是我还没想到的其他方式,只要它不会产生很大的性能开销。任何建议都将不胜感激。
答案 0 :(得分:1)
因此,正如我上面所说,Web Workers能够在没有非活动标签的1秒延迟的情况下调用setTimeout()。我的解决方案是创建一个Web Worker,它只负责调用setTimeout()(在其onmessage事件监听器中调用)。然后,在每个游戏循环结束时,我打电话给:
this.worker.postMessage(null)
可以说,让Web Worker比调用setTimeout()更有责任,因为我已经添加了等待主线程和worker之间发送消息的开销。这是我将来可能会看到的。
这样做的主要问题是与IE的兼容性;在版本10.0之前,IE不支持Web worker。这对我来说并不是一个问题,但我认为值得一提。