重新开放游戏时执行“追赶”

时间:2015-06-20 19:25:45

标签: ios swift 2d-games

处理游戏结束时应该发生的所有操作的“追赶”有什么好方法?

示例:Tiny Towers。供应商,商店,顾客:当一个人关闭游戏并在第二天打开游戏时,应用程序必须弄清楚发生的一切。

我们试图通过快速模拟一切来计算这一点,基本上从他们离开游戏时快速转发。不幸的是,这可能需要20秒或更长时间。

有什么建议可以更好地处理这个问题?

1 个答案:

答案 0 :(得分:1)

这是一个很好但非常开放的问题。

根据您的需求,能力和实施时间,有多种方法可能比其他方法更好。作为非游戏开发者,我会尝试回答它(编辑:非常)。

您的建议无异于通过加快所涉及的计时器来模拟游戏而无需用户交互。要实现这一点,您需要确定离散时间段的基本计数器,如刻度线。当游戏恢复时,你会这样做:

for (NSUInteger i = 0; i < numberOfTicksMissed; i++) {
    doGameStuffThatWeMissedForTick(i);
}

计数器i可能不是必需的 - 实际上它不应该是,因为它可能应该在游戏状态的模型中隐式捕获,但重点是你是字面意思赶上这种方法。

你可以节省一些时间,尽可能多地在后台运行,但实际上,这只是将周期分散而不是减少它们。

另一种方法是通过近似来间接模拟游戏执行。这意味着您不是实际执行所有步骤,而是通过该数字的某个除数运行,并且&#34; guesstimate&#34;两者之间会发生什么。

因此,例如,游戏状态可能必然是随机的 - 你在那里有一个随机数字,而且你已经错过了1000000个蜱虫。好吧,而不是做所有1000000,做1000,并使用统计数据来模拟每个&#34; 1000-tick&#34;中发生的事情。例如,我们知道如果您翻转一两次硬币,您可能会看到所有头部或所有尾部 - 但如果您翻转硬币很多次,则每个硬币的频率接近0.5。

因此,如果你的游戏需要在每个刻度线中翻转硬币,那么在每个&#34; 1000-tick,&#34;中进行一次滴答是不合理的。而是模拟1000个硬币翻转的方差,得到一个介于更紧密范围之间的数字,如0.48到0.52。顺便说一下,这还不够紧,但你明白了。

如果您没有涉及随机性,您还可以使用数学来获得精确或近似精确的解决方案,前提是该系统本质上不是混乱的。这需要对系统进行仔细研究。

在Tiny Towers的情况下,我的猜测是他们优化了游戏,因此即使你在玩游戏,资源和其他费率的计算机积累率也不是通过模拟而是通过计时器得出的。因此,您必须根据规则构建资源以获取资源,但计算机每分钟获得X金,依此类推。由于所涉及的动画,它可能看起来不像那样,但这可能是正在发生的事情。

总之,首先您需要了解正在模拟的系统。

如果它是确定性的,那么在保存或退出游戏时,游戏应该至少保存所有相关参数(使用类似纪念品的东西)。然后在当时或加载时,游戏可以使用您的分析进行前向计算或近似。如果它对初始条件敏感(混乱),则需要使用精确计算。

如果它不是确定性的,那么在保存/退出时你也需要捕获所涉及的变量,但是你的分析和正向计算将需要使用一些统计方法来减少所涉及的滴答数量级。 。想想硬币翻转类比。

示例:黄金累积

让我们说恢复的唯一状态是恢复时计算机有多少金币。

如果计算机每秒总是获得10金币,那么我们可以遍历所有缺失的滴答声......

  • 暂停:电脑有X金
  • 1000秒后恢复
  • 第二名0:电脑有X金
  • 第二名1:电脑有X + 10金
  • 第二个2:电脑有(X + 10)+10金币 ...
  • 第二个1000:电脑有(10 +(10 +(10 + .... +(10 + X)))))...金

我们会在第二个1001开始时发现计算机有X + 10,000金币。

当然,这会浪费。因为乘法是迭代加法,我们可以这样做:

  • 暂停
  • 1000秒后恢复
  • 计算金币:电脑有X +(1000 * 10)金
  • 启动

现在,如果黄金的积累是正常随机的,那么也许在你玩的时候,对这种随机性有一些好奇心。所以也许规则是每一秒,计算机可以获得10金币或获得0金币。这可能会让玩家更感兴趣,因为计算机可以继续进行热连接。并真正挑战玩家,或冷酷等等。

但是在模拟中不需要阴谋,因此可以在N分钟后基于黄金的期望进行统计建模。当然,我们取平均值,如果我们想要的话,我们可以在那里引入一小部分随机性,这是相当现实的。

例如,让我们说你说'#34;根据99.7%的情况会发生什么来模拟这个。&#34;

根据可靠的68-95-99.7规则,3个标准偏差是模拟这种情况所需的紧张程度。

所以,我们有:

  • 暂停
  • 1000秒后恢复
  • 计算金标准差:sqrt( 1000 * 0.5 * (1-0.5)约为16
  • 在1000秒后找到随机模拟金币:X + (1000*0.5*10) + RANDOM(-1,1)*48*10

在最坏的情况下,电脑有X + 5480金色。

请注意,理论限制(0和10000)与99.7%的情景(4520和5480)中的可能性范围之间存在巨大的差异。这是统计数据的力量。

这可以被利用来优化另一个不可预测的运行循环。例如,如果黄金达到6000,您可能必须进行复杂的模拟。通过将方案限制为99.7%,您甚至无需考虑它,因为最大可能值小于阈值。

现在,请注意,复杂的系统并不总是像这样工作。所以说规则是:计算机每秒获得1金币,但是第一次时间总金额的总和达到一个素数,计算机就会失去所有金币。

喜欢:1,0,1,2,0,1,2,3,4,0,1,2,3,4,5,6,0,1 ......

现在你必须提出素数定理和可能的因子数,并做各种各样的事情。所以真的,1000秒之后,如果你有10金币,而电脑有100金币,需要200金才能获胜,我们是否应该打扰造型呢?

当然,这是一种方法,但我笨拙地提出的一点是,这个相对简单的系统的复杂性使纯粹的计算方法变得不可行 - 也许也是一个统计方法。

组块

我没有提到过的一个想法是将要分批完成的工作分块,以便首先完成用户交互所必需的工作,然后再将所有内容变得笨拙。

所以,我们假设我们正在开发一款计算机位置非常重要的游戏。然后我们可以先问一个问题:计算机是否会很快出现?

如果没有,那么我们可以继续渲染场景而不用担心计算机是否可见。然后,一旦渲染场景,工作的焦点可以转移到计算机的确切位置的问题。

这是一个天真的思考过程:

  1. 查看计算机是否可见需要多长时间(估计)?
  2. 找出计算机在一定容差范围内需要多长时间?
  3. 玩家在可能接触电脑之前的最短时间是多少?
  4. 游戏可能会执行以下操作:

    • 玩家在我们离开他的位置X
    • 计算机与X
    • 的距离至少为1000
    • 玩家最多可以向计算机移动,而玩家可以在10秒内完成距离合并
    • 玩家无法看到计算机,除非它距离或更近距离
    • 我们可以在10秒内计算出计算机的准确位置

    然后:

    • 首先,让我们渲染玩家场景并让他继续前进。
    • 同时,在低优先级后台队列中,让我们开始计算计算机位置
    • 玩家进行互动后,继续以更高的优先级计算计算机的位置
    • 一旦玩家进行互动,就开始保留计算机位置相关活动的队列
    • 当计算机位置已知时,请应用队列
    • 必要时重新呈现
相关问题