AStar寻路1-实现基本功能 的性能优化篇
优化方法,因为为了查看代码的profiler,因此用Unity来实现图形化,VS的c#有性能测试工具,根据热点函数来寻找瓶颈点和优化策略。
通过VS的性能测试工具,得出了上篇的热点函数是排序相关和估值函数。
A星寻路得到的路径,大部分情况下不会是最短路径,但是肯定是接近最短路径,只有每次的估计值是真实最短路径的值,那么得出的才会是最短路径。
原因是A星选择的贪心策略存在的误差是估值得来的,而该点的f值只会计算一次会一直用到寻路点直到终点,而不会随时调整,然后排序。
因此A星的精度和速度和估值函数的算法很重要,常见的几种估值方法
1.曼哈顿距离法,目标点和垂直距离与纵向距离之和,
2.直线距离法,直接是2点的距离,缺点是开方CPU代价太大。但是得到的路径较为平滑,开销大概是曼哈顿的2倍左右
3.还有一种方法,综合了2和1的特点,基本思想是如下图的A到B点
搜索过程中,从空间来说,因为不确定是否存在路径,因此要保存完整的节点信息,最坏情况是没有路径,空间占用就是节点总数。重复寻路的话Node对象的复用避免new的频繁开销也是一个优化点
open表的排序从时间来说,每次插入操作都要保证open列表中是有序的,一种优化方案是使用二叉堆来保证open表的有序
通过数组实现,来快速索引节点在堆中的位置做插入操作
二叉堆的相关知识不在展开。