示例:Tiny Towers.供应商,商店,顾客:当一个人关闭游戏并在第二天打开它时,应用程序必须弄清楚发生的一切.
我们试图通过快速模拟一切来计算这一点,基本上从他们离开游戏时快速转发.不幸的是,这可能需要20秒或更长时间.
有什么建议可以更好地处理这个问题吗?
解决方法 这是一个很好但非常开放的问题.根据您的需求,能力和实施时间,有多种方法可能比其他方法更好.作为一个非游戏开发者,我将试图回答它(编辑:非常).
您的建议无异于通过加速所涉及的计时器来模拟游戏而无需用户交互.要实现这一点,您需要确定离散时间段的基本计数器,如刻度线.当游戏恢复时,你会做:
for (NSUInteger i = 0; i < numberOfTicksMissed; i++) { doGameStuffThatWeMissedForTick(i);}
计数器i可能不是必需的参数 – 实际上它不应该是,因为它可能应该在游戏状态的模型中隐式捕获,但重点是你实际上正在追赶这种方法.
你可以节省一些时间等待在后台尽可能多地运行它,但实际上,这只是将周期扩散而不是减少它们.
另一种方法是通过近似来间接模拟游戏执行.这意味着您不是实际执行所有步骤,而是通过该数字的某个除数运行,并“猜测”两者之间发生的事情.
因此,例如,游戏状态可能必然是随机的 – 你在那里有一个随机数,你错过了1000000个刻度.好吧,不是做所有1000000,而是做1000,并使用统计来模拟每个“1000-tick”中发生的事情.例如,我们知道如果您翻转一两次硬币,您可能会看到所有头部或所有尾部 – 但如果您翻转硬币很多次,则每个硬币的频率接近0.5.
因此,如果你的游戏需要在每个刻度中翻转硬币,那么每个“1000刻度”做一个刻度是不合理的,而是模拟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分钟后的黄金预期来统计建模.当然,我们采取平均值,如果我们想要,我们可以在那里引入一小部分随机性,这将是相当现实的.
例如,假设您说“让我们根据99.7%的情况会发生什么来模拟这个问题.”
根据可信赖的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,1,2,3,4,5,6,1 ……
现在你必须提出素数定理和可能的因子数,并做各种各样的事情.所以真的,在1000秒之后,如果你有10金币,而计算机有100金币,需要200金才能获胜,我们是否应该打扰造型呢?
当然有一种方法,但我笨拙地提出的一点是,这个相对简单的系统的复杂性使纯粹的计算方法变得不可行 – 也许也是一个统计方法.
分块
我没有提到过的一点是想要分批完成工作,以便首先完成用户交互所必需的工作,然后再将所有工作变得模糊不清.
所以,假设我们正在开发一款计算机位置很重要的游戏.然后我们可以首先提出一个问题:计算机是否会很快出现?
如果没有,那么我们可以继续渲染场景而不用担心计算机是否可见.然后,一旦渲染场景,工作的焦点可以转移到计算机的确切位置的问题.
这是一个天真的思想过程:
>需要多长时间(估计)才能确定计算机是否可见?
>找出计算机在一定容差范围内需要多长时间?
>在他甚至可能接触到计算机之前,玩家的最短时间是多少?
游戏可能会执行以下 *** 作:
>球员位于我们离开他的位置X.
>计算机与X的距离至少为1000
>玩家最多可以向计算机移动,而玩家可以在10秒内将计算机移动100个距离
>除非距离或距离较近,否则玩家无法看到计算机
>我们可以在10秒内计算出计算机的准确位置
然后:
>首先,让我们渲染玩家场景并让他继续前进.>同时,在低优先级后台队列中,让我们开始计算计算机位置>一旦播放器处于交互状态,继续以更高的优先级计算计算机的位置>一旦玩家进行互动,就开始保持计算机位置相关活动的排队>当计算机位置已知时,应用队列>如有必要,重新渲染
总结以上是内存溢出为你收集整理的ios – 重新开放游戏时执行“追赶”全部内容,希望文章能够帮你解决ios – 重新开放游戏时执行“追赶”所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)