我有一个寻路的老板敌人,它使用A *算法寻找玩家。这是一个非常复杂的环境,我在Flash中进行操作,因此,如果在长距离搜索,搜索可能会变得有点慢。如果播放器静止不动,我只能搜索一次,但此刻我正在搜索每一帧。这花费了足够长的时间,以至于我的帧速率正在遭受痛苦。
通常的解决方案是什么?是否可以在不重新进行整个搜索的情况下“重新计划” A *?我是否应该减少搜索频率(每半秒或第二秒),并接受路径中的一些误差?
我有一个寻路的老板敌人,它使用A *算法寻找玩家。这是一个非常复杂的环境,我在Flash中进行操作,因此,如果在长距离搜索,搜索可能会变得有点慢。如果播放器静止不动,我只能搜索一次,但此刻我正在搜索每一帧。这花费了足够长的时间,以至于我的帧速率正在遭受痛苦。
通常的解决方案是什么?是否可以在不重新进行整个搜索的情况下“重新计划” A *?我是否应该减少搜索频率(每半秒或第二秒),并接受路径中的一些误差?
Answers:
如果距离很大,则可以使用接近检测每隔几帧运行一次算法(因为在大多数情况下,如果距离很大,则目标路径在帧与帧之间不会发生很大变化)。例如:
Distance > 100, run A* every 2 seconds
100 > Distance > 50, run A* every 1 second
50 > Distance > 25, run A* every 10 frames
25 > Distance < 25, run A* every frame
这是假设在每帧运行A *时仍存在可接受的距离。简而言之,我会选择您的第二个选择。特别是如果您的工作正常,如果可以缩小工作范围,我将避免重新实现其他功能。最重要的是,您必须尝试一下它是否适用于您的游戏。
我为48场比赛创建了一个游戏,其中A *角色在某个级别上跟随玩家。因为我的A *实现速度很慢(无法在每个帧中运行),所以我将间隔设置为三秒的延迟。产生了意想不到的结果,使玩家可以“欺骗” AI一会儿。它实际上使游戏变得更加有趣。
后来,我改进了A *实现的性能,并尝试在每个帧上运行它。游戏停止了乐趣,因为敌人总是会完美地寻找玩家。
那是出乎意料的,也是一次很好的学习经历。
除非您绝对希望(或需要)使用A *,否则还可以查看“ 转向行为”。由于所涉及的每个帧都没有完整的路径规划,因此在处理上应该要轻得多。