游戏前的加载时间与游戏中的加载时间


9

我正在开发一款包含随机迷宫的游戏。
有一些AI生物潜伏在迷宫中。我希望他们按照迷宫形状走一些路。

现在,我有两种实现方法,第一种方法(我使用的方法)是在迷宫创建后通过计算多个所需的潜伏路径。
第二种方法是,当生物开始潜伏时,计算一次需要计算的路径。

我主要关心的是加载时间。如果在创建迷宫时计算了许多路径,那么预加载时间会比较长,因此我考虑在需要时进行计算。
目前游戏还不是很“繁重”,因此在中间游戏中计算路径并不引人注目,但恐怕一旦变得更加复杂,它就会出现。

任何建议,评论,意见将有所帮助。

编辑:

就目前而言,让我们p以预先计算的路径数为准,一个生物有可能1/p选择一条路径(这意味着进行路径计算),而不是采用一条现有路径。
当然,除非完全计算出路径,否则生物不会开始巡逻,因此无需担心他会在此过程中被杀死。


8
此时,它将进行预优化。在出现问题之前,我会保持原样。
约翰·麦当劳

3
为了让@JohnMcDonald有点生气,如果您可以在游戏中期计算这些路径并且它并不引人注目,那么它们在加载时会产生多少贡献因素?
詹姆斯

Answers:


6

BerickCook正确表达了这个想法。如果现在可以正常运行,请将计算保留在原处。

如果您可以在之前进行计算,并且确定在游戏中期将不需要它们,那么请先进行计算。否则在加载后执行。如果游戏期间的计算不明显,则可以在那里进行计算。如果在某个时候复杂性发生了变化,并且计算变得过于繁琐,则开始进行优化。

但有一件事:如果您的计算是在游戏中期进行的,则始终可以始终在加载过程中强制执行这些计算。

有许多解决方案:

  • 在关卡创建/加载过程中计算/加载路径
  • 使用第二个线程来计算路径
  • 优化算法
  • 如果您无法访问线程,请使用可中断系统。

我已经看到并使用了大众市场游戏中的最后一个选项。只需确保您正确保存了恢复计算所需的所有数据,并在计算过程中定期检查剩余时间/操作。

根据您的情况,可中断系统可以提供初步解决方案和部分解决方案,可以在计算结束之前使用这些解决方案。


编辑:回答@Keeper

“可中断算法”仅由于我们的约束而有用。基本上,我们对缺乏多线程感到苍白。

在某一时刻,我们有一款游戏,其中AI必须基于多个词典来计算大量动作。在此计算过程中,所有动画都将停止,因为当词典适用于多人游戏时(其中AI甚至必须针对玩家的动作进行交互),词典都会使用更多的数据进行扩展,并且包含数据的数据集会发生变化且效率降低。我们只有一个线程可用于游戏循环(当务之急是必须在所有受支持的平台上运行多平台代码)。在这一点上,决定中断计算算法,以便我们可以中断它。因此,我们不能仅使用已存在的递归系统,因为无法保存变量。这些函数被替换为仅包含所有必需变量和指向父对象和子对象的指针的对象。我不

  • 保存其当前计算的状态
  • 在循环结束时或在循环期间中断(子对象中断时)
  • 时间到时退出
  • 继续执行恢复操作,停止在正确的索引处重新启动循环或调用当前位于其子堆栈顶部的子对象。
  • 如果计算中断,请清理所有内容
  • 给出最好的局部结果。

只有最昂贵的操作被分解为单独的对象,并且花了一些时间找到可以停止计算的正确位置,但最终效果很好。

我们失去了性能,但是随着动画在所有平台上的平稳运行,用户的性能要好得多,然后所有平台都可以使用较大的词典,而不会出现动画断断续续或停滞的情况。同样,这使我们可以在以后需要时并行运行多个实例。

当然,现在在iPhone和iPad上,游戏不需要这个,使用第二个线程将是理想的选择。但是我怀疑代码仍然存在。


谢谢,听起来很有趣。您能否详细介绍一下“可中断系统”的概念(为什么以及如何做)。(搜索并不是那么有用。)。我将在问题中添加一些细节。
守护者2012年

@Keeper我希望我回答了您有关可中断部分的问题。这是一件很痛苦的事,但要做的事情与大多数现代系统无关。
郊狼2012年

即使我现在暂时不使用此方法,您还是对新事物睁开了眼睛。您的答案值得接受。
守护者2012年

8

就目前而言,由于在比赛中计算路径并不明显,因此这是理想的方法。如果/到达计算被游戏中断的地步,则将其切换为在加载关卡之前对路径进行逐个计算。

较长的初始加载时间是可以原谅的,但是在游戏过程中通常不会出现随机的FPS波动。


2

如果您需要的话,一种可能是将计算移至第二个线程,因为如今几乎每台PC都具有多个CPU内核。

基本过程将是:

  • 当生物请求路径时,将请求添加到线程安全请求队列中并发出信号。
  • 当等待线程将条目从该队列中弹出,对其进行处理并将其放入完整列表时,Creature处于空闲状态。
  • 每个帧都会从主线程中检查完成的列表,并为生物分配完成的路径。

您还必须注意一些额外的情况(例如,如果该生物在处理请求之前死亡)。


2
如果不想引入线程,还可以递增地计算路径(例如,每帧计算一些步骤)。
bummzack 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.