BerickCook正确表达了这个想法。如果现在可以正常运行,请将计算保留在原处。
如果您可以在之前进行计算,并且确定在游戏中期将不需要它们,那么请先进行计算。否则在加载后执行。如果游戏期间的计算不明显,则可以在那里进行计算。如果在某个时候复杂性发生了变化,并且计算变得过于繁琐,则开始进行优化。
但有一件事:如果您的计算是在游戏中期进行的,则始终可以始终在加载过程中强制执行这些计算。
有许多解决方案:
- 在关卡创建/加载过程中计算/加载路径
- 使用第二个线程来计算路径
- 优化算法
- 如果您无法访问线程,请使用可中断系统。
我已经看到并使用了大众市场游戏中的最后一个选项。只需确保您正确保存了恢复计算所需的所有数据,并在计算过程中定期检查剩余时间/操作。
根据您的情况,可中断系统可以提供初步解决方案和部分解决方案,可以在计算结束之前使用这些解决方案。
编辑:回答@Keeper
“可中断算法”仅由于我们的约束而有用。基本上,我们对缺乏多线程感到苍白。
在某一时刻,我们有一款游戏,其中AI必须基于多个词典来计算大量动作。在此计算过程中,所有动画都将停止,因为当词典适用于多人游戏时(其中AI甚至必须针对玩家的动作进行交互),词典都会使用更多的数据进行扩展,并且包含数据的数据集会发生变化且效率降低。我们只有一个线程可用于游戏循环(当务之急是必须在所有受支持的平台上运行多平台代码)。在这一点上,决定中断计算算法,以便我们可以中断它。因此,我们不能仅使用已存在的递归系统,因为无法保存变量。这些函数被替换为仅包含所有必需变量和指向父对象和子对象的指针的对象。我不
- 保存其当前计算的状态
- 在循环结束时或在循环期间中断(子对象中断时)
- 时间到时退出
- 继续执行恢复操作,停止在正确的索引处重新启动循环或调用当前位于其子堆栈顶部的子对象。
- 如果计算中断,请清理所有内容
- 给出最好的局部结果。
只有最昂贵的操作被分解为单独的对象,并且花了一些时间找到可以停止计算的正确位置,但最终效果很好。
我们失去了性能,但是随着动画在所有平台上的平稳运行,用户的性能要好得多,然后所有平台都可以使用较大的词典,而不会出现动画断断续续或停滞的情况。同样,这使我们可以在以后需要时并行运行多个实例。
当然,现在在iPhone和iPad上,游戏不需要这个,使用第二个线程将是理想的选择。但是我怀疑代码仍然存在。