为了方便后期的热更新需求,项目基本上全部逻辑都使用了纯lua实现,最近遇到一个大地图寻路的算法问题,有两百多个城市的拓扑结构图,寻找最短路径,算法本身没有什么好讲的,A*的广度优先算法,但在lua层照搬A*的实现逻辑,会有极大的性能压力,要求算法本身做些有利于脚本的优化。
优化思路如下:
1.A*需要开放节点列表,关闭节点列表,涉及大量的链表操作,在lua里从表结构里删除和向表结构里添加节点都是非常耗费性能的操作,基本思路是用一个表结构来同时实现开放节点列表和关闭节点列表。
local searchNodes = {}
searchNodes[Node2] = 权重 --开放节点
searchNodes[Node3] = false --关闭节点
2.A*查找最优子节点时,需要遍历开放节点列表,选取当前最优扩展节点,通常采取的做法是对开放节点列表做一次排序(也有算法在插入时维护开放节点的有序性),选取最优节点。但对lua而言,排序是很耗性能的操作,并切要求必须维持开放节点列表是一个数组,这样不管删除和插入都会导致数组的后续元素更新,所以采用筛取法来获取最优节点。
local function onSearchGood()
local cNode = nil
local cStep = 10000000000
for cityId,cityStep in pairs(searchNodes) do
if cityStep and cStep > cityStep then
cNode = cityId
cStep = cityStep
end
end
if cNode then
searchNod