如何提高我的A *路径查找器的性能?

时间:2013-02-27 14:46:41

标签: java artificial-intelligence a-star

所以基本上我编写了一个A *探路者,可以找到通过障碍物的路径并移动诊断。我基本上将http://www.policyalmanac.org/games/aStarTutorial.htm中的伪代码实现为实际代码,并使用二进制堆方法从开放列表中添加和删除项目。

使用二进制堆可显着提升性能,比我之前使用的插入排序算法快约500倍。

问题是它仍然需要平均150万纳秒,大约是0.0015秒。

所以问题是,我的计划是制作一个塔防游戏,每当我向地图添加一个塔时,每个暴徒的寻路需要更新。如果我在地图上最多有50个怪物,这意味着需要大约.0015 * 50 = .075秒来更新整个暴徒的所有路径。游戏基本上每1/60秒滴答(所有游戏内容更新),这是0.016秒,因此问题是更新路径所需的时间比勾选时间长,这将导致大量延迟。那我该怎么办呢?我是否需要找到一个更好的算法来排序开放列表或以某种方式划分寻路任务,以便每个滴答只执行X个寻路任务而不是所有这些任务。

3 个答案:

答案 0 :(得分:3)

不是从每个敌人搜索到检查站,而是立即从检查站向外搜索每个敌人。这样,您只需要进行50次搜索,而不是进行50次搜索。

更具体地说,只需从玩家向外进行广度优先搜索(或djikstra's,如果您的图表已加权),直到达到每个敌人。

您可以通过将启发式EstimatedDistanceToEnd (又名h(x)更改为对任何敌人的最低估计值来改变此策略以使用A *,但需要很多敌人可能最终比简单的选项更慢。启发式必须consistent才能使其正常工作。


此外,请确保您使用的是correct tie-breaking criteria

另外,最重要的是,请记住,对于大多数游戏来说,你不需要每一帧运行你的探路者 - 通常你只能每秒一次或两次,甚至更少,取决于游戏。

如果仍然太慢,您可以考虑使用D* lite在后续搜索之间重用信息。但是,我敢打赌,运行单一广度优先搜索的资金将足够快。

(从我对gamedev的a similar question的回复中复制)

答案 1 :(得分:1)

您是否考虑过Floyd-Warshall算法?

基本上,A *用于从单个源到一个或多个目的地的路径查找。但是,在塔防(根据你的规则),它是关于在地图上导航的多个来源。

因此,Floyd的算法似乎更优化。但是,您可以让A *算法查找单位的路径,而不是单个单位,这样可以优化您的计算时间。

答案 2 :(得分:0)

据推测,您可以从出口向所有小兵进行反向搜索,因此您只需要探索一次迷宫。