A*寻路算法优化方法

A*寻路算法是游戏开发中使用得比较多的寻路算法,主要用在rgp游戏中主角或者怪物的寻路,其寻路的效率也是比较高,但是如果一个地图比较大或者怪物比较多的时候,同时使用寻路算法会导致游戏出现卡顿现象,在大部分游戏中,角色或者怪物寻路,并不需要找最短的那条路径,在性能允许的情况下,找一条次优或者其它的路径也可以,这样可能更适合游戏,所以,我们需要根据游戏的特点,去优化寻路算法,优化A*的寻路,我能想到的暂时只有以下几种(仅适用于基于网格的寻路):

1.修改寻路估值函数

A*寻路算法的核心部分是其对目标路径的估值函数,估值函数的好坏直接影响寻路算法的效率,如果把估值函数去掉,那么A*算法和Dijktra算法一样了,目前A*算法有很多其它的变异,正常的A*寻路的估值函数(h)是从当前点到目标点的x差值绝对值X,y差值的绝对值之和Y,我们可以根据自己游戏中地图的特点,在X和Y上分别乘以一个系数,可以加大估值函数在整个路径中的权重,但是最终得到的路径可能不是最短的,算法的效率却可以提升很多.

2.加快插入结点到openlist中的效率

在A*的每一次寻路过程中,每找到一个新的路点都需要将其插入到openlist中,为了使openlist保持有序,所以插入元素时,最坏的情况需要遍历整个openlist列表,因为插入操作比较频繁,所以加快每一次的插入操作,能加快整体的寻路速度.A*寻路每一次都是查找周围4个或者8个邻居节点,再将符合条件的邻居节点插入到openlist中,由于当前节点和邻居节点的F(g+h)值是比较接近的,如果邻居节点已经在openlist列表中,是否可以从邻居节点开始查找当前节点的插入点,答案是肯定的,在插入时,如果有邻居节点已经在openlist中,可以找出邻居节点中小于当前节点的最大节点的位置进入插入查找,这样可以减少遍历节点的个数.如果当前节点已经在openlist中,并且当前路径的F值比openlist中的F值更小,则直接更新当前节点的信息(h,f,parent)即可,这样就不用再进行重新排序,但是最终的路径可能也不是最短的.

3.保存邻居节点的引用,减小寻路判断次数

在进入游戏加载地图时,将每个节点的邻居节点的引用保存到一个数组中,在寻中过程中直接遍历数组即可取出邻居节点,不需要进行更多的判断

你可能感兴趣的:(cocos2dx)