【发布时间】:2021-10-07 00:04:54
【问题描述】:
我在空闲时间一直在开发一款空闲/增量游戏。
使用 setInterval 每秒调用多次主游戏循环函数。
由于 chrome(可能还有其他浏览器)将函数调用限制为每秒 1 次,我的游戏循环没有正确更新正确的次数,所以现在我正在研究网络工作者。
在阅读了 MDN 上的 WebWorkers 文档后,我仍然对如何正确实现 Web Worker 有疑问。
我目前的想法是检测用户何时交换标签(onblur):
- 暂停游戏循环的 setInterval
- 用当前游戏状态向我的工作人员发布消息
- 在worker中,继续计算游戏状态
- 当标签重新聚焦时,发回消息并使用消息更新游戏状态
- 取消暂停 setInterval 并终止工作人员。
这是使用 Web Worker 的正确方法吗?
谢谢!
-编辑-
一些附加信息,我的游戏是一个类似于 cookie clicker 的闲置游戏,因此没有任何位置跟踪。
我的gameLoop 中的一个非常简短的想法是对gainResources(resourcePerSecond/gameTickRate) 的函数调用。
【问题讨论】:
-
每个tick你必须更新什么?职位?碰撞多吗?其他的?浏览器中最好的方法是无论如何都不要依赖你的滴答声来触发。而是计算自上次滴答以来每个对象已经进化了“多少”。这样标签可以暂停,你的游戏逻辑仍然是“活着的”。无论如何,即使您的网络工作者也会受到限制。
-
我更新了原帖。游戏需要更新的只是
resourceAmount、questProgress等。我还看到其他人提到跟踪更新之间的时间并相应地做一些事情,但我认为网络工作者会是一个更好的解决方案。 -
他们不会。很快浏览器就会像 UI 线程一样限制它们。那么唯一的方法是保留一些东西,以防止标签被完全限制(有几种方法),但这也意味着你的标签会为像乘法这样简单的东西吃掉很多资源,这对树。
-
嗯,好吧。那讲得通。我想我会实施 delta diff 方法并根据
timeSinceLastUpdate计算资源。感谢您的意见。 -
这个video 正是你想要的,而这个gist with workable solution 来自同一个视频。值得一看。信息量很大
标签: javascript web-worker