Lua寻路代码需要优化

时间:2016-01-19 23:04:25

标签: performance optimization lua path-finding roblox

在我的代码处理了一段时间后,优化最明显的事情,我得到了这个:

app
   a
     Ulil.py
   b
     main.py

问题在于,注意到的行会出现某种游戏脚本超时错误(我认为这是因为质量递归而没有屈服)。我也觉得一旦这个问题得到解决,即使在pacman板的规模上也可能相当缓慢。有没有办法可以进一步优化它,或者可能是一个更好的方法,我可以研究类似的呢?

UPDATE :由于效率低下,我最终决定废弃我的算法,并实施了Dijkstra算法进行寻路。对于任何对源代码感兴趣的人,可以在这里找到:http://pastebin.com/Xivf9mwv

3 个答案:

答案 0 :(得分:1)

您知道Roblox为您提供了PathfindingService吗?它使用C面A *路径来快速计算。我推荐使用它

http://wiki.roblox.com/index.php?title=API:Class/PathfindingService

答案 1 :(得分:0)

尝试重新构建算法以使用尾调用。这是Lua提供的一种很好的机制。

尾部调用是一种递归,其中函数返回函数调用作为它做的最后一件事。 Lua有适当的尾部调用实现,它将这个递归装扮成一个' goto'在幕后,所以你的筹码永远不会打击。

传递'路径'作为FindPath的一个参数可能会有所帮助。

答案 2 :(得分:-1)

我看到你关于抛弃代码的编辑,但只是为了帮助其他人绊倒这个问题:

  • ipairs比对慢,这比 -loop的数字要慢。 如果性能很重要,请不要使用ipairs,而是使用 for i = 1,#tab loop
  • 如果要克隆表,请使用for循环。有时候,你 要使用unpack (返回动态数量的尾随nils),但这是这种情况。解包也是一个缓慢的功能。

或数字for循环替换 ipairs 并使用循环代替 unpack 将提高的性能

如果您想获得表格中的最低值,请使用以下代码段:

local lowestValue = values[1]
for k,v in pairs(values) do
    if v < lowestValue then
        lowestValue = k,v
    end
end

这可以为您的路径示例重写,如下所示:

local least = #path[1]
for k,v in pairs(path) do
    if #v < least then
        least = v
    end
end

我必须承认,你很有创造力。不是很多人会使用math.min(unpack(tab))(不计算它的坏处)