【问题标题】:Idle games and web workers for background tabs背景标签的空闲游戏和网络工作者
【发布时间】:2021-10-07 00:04:54
【问题描述】:

我在空闲时间一直在开发一款空闲/增量游戏。

使用 setInterval 每秒调用多次主游戏循环函数。

由于 chrome(可能还有其他浏览器)将函数调用限制为每秒 1 次,我的游戏循环没有正确更新正确的次数,所以现在我正在研究网络工作者。

在阅读了 MDN 上的 WebWorkers 文档后,我仍然对如何正确实现 Web Worker 有疑问。

我目前的想法是检测用户何时交换标签(onblur):

  1. 暂停游戏循环的 setInterval
  2. 用当前游戏状态向我的工作人员发布消息
  3. 在worker中,继续计算游戏状态
  4. 当标签重新聚焦时,发回消息并使用消息更新游戏状态
  5. 取消暂停 setInterval 并终止工作人员。

这是使用 Web Worker 的正确方法吗?

谢谢!

-编辑-

一些附加信息,我的游戏是一个类似于 cookie clicker 的闲置游戏,因此没有任何位置跟踪。

我的gameLoop 中的一个非常简短的想法是对gainResources(resourcePerSecond/gameTickRate) 的函数调用。

【问题讨论】:

  • 每个tick你必须更新什么?职位?碰撞多吗?其他的?浏览器中最好的方法是无论如何都不要依赖你的滴答声来触发。而是计算自上次滴答以来每个对象已经进化了“多少”。这样标签可以暂停,你的游戏逻辑仍然是“活着的”。无论如何,即使您的网络工作者也会受到限制。
  • 我更新了原帖。游戏需要更新的只是resourceAmountquestProgress 等。我还看到其他人提到跟踪更新之间的时间并相应地做一些事情,但我认为网络工作者会是一个更好的解决方案。
  • 他们不会。很快浏览器就会像 UI 线程一样限制它们。那么唯一的方法是保留一些东西,以防止标签被完全限制(有几种方法),但这也意味着你的标签会为像乘法这样简单的东西吃掉很多资源,这对树。
  • 嗯,好吧。那讲得通。我想我会实施 delta diff 方法并根据timeSinceLastUpdate 计算资源。感谢您的意见。
  • 这个video 正是你想要的,而这个gist with workable solution 来自同一个视频。值得一看。信息量很大

标签: javascript web-worker


【解决方案1】:

我阻止后台选项卡限制的解决方案是计算每个循环之间的时间差,并使用该值来计算应该更改多少内容,假设您的循环更新资源量等内容。

例子-

function loop() {
    let now = Date.now();
    let diff = now - Game.lastUpdate;
    Game.lastUpdate = now;
    // diff is now the exact amount of ms since loop has been called.
}

这样您还可以确保提供准确的生产率,因为 setInterval 不会每次都以完全相同的时间间隔调用函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-09
    • 2013-05-18
    • 1970-01-01
    • 2013-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多