求问,A* 寻路后如果目标移动,如何优化性能

A星寻路得到路径数组,而如果目标是移动单位,该如何优化呢?
如图所示,这是理想的中间无障碍物的情况,而两个士兵都在移动,而移动到位置后目标已到了别处。

想到了一个办法是
每移动完一个格子,就判断一下,最后的路径和目标的距离是否已经超出攻击范围,比如
if (!最后的移动坐标.fuzzyEquals(this.B.node.position, 10)) {
//目标移动了,重新A*寻路
}
就再一次寻路,但这个性能消耗太大了,上去一百个士兵担心性能不足,估计肯定会性能不足。

有没有什么牛逼普拉斯的方法,能不连续使用A*寻路吗?
@jare @BigBear

1赞

求助求助求助

  • 让寻路的终点P为起点继续寻路得到路径B,之前的寻路结果A保留。
  • 等到操作目标移动到终点P时候再使用此路径B进行移动。
  • 如果目标距离这个终点A比较远时或者离目标比较近,放弃所有寻路结果A、B,重新计算移动路径。

总之,思路就是 保留基本不变的路径,只改变需要改变的路径

几个方面,首先连续使用A的性能可能并没有你担心的那么差,我那个塔防投兵就是总重新使用传统A的,我自己测试同屏10塔50兵,小米6的chrome没有什么性能问题。

其次,如果你真的需要改善,有两个方向

方向一我做过一些实验,的确是有改善的,但是也要分两步进行,分别对应一大类论文要看

我也做了些图说明更新单次获取expander与边权重的关键步骤示意图,可以看看。



另外论文都是针对有向图的,游戏的网格地图一般是无向稀疏图,你可以把无向边拆成两条有向边来做(至少我自己是这么做)。

1赞

https://mp.weixin.qq.com/s/iWwb-M1UVMsdON_DlTHhew

我整理了一些a优化的方法,不过是针对a本身的

设计map存储a*的第一步结果,格式例如1,2点到7,8点:astarMap[‘1,2,7,8’]={x:2,y:3};

如果已经存在,使用结果,不存在开始计算a*,并将结果存进astarMap。

每帧都重新计算很耗时,可以平摊到每一帧只计算多少个角色

设定一个间隔