我目前正在尝试在2D-sidescroller程序生成的世界游戏中使用A *寻路(想想类似Terraria的地形)。
我一直在使用这个资源:http://www.redblobgames.com/pathfinding/a-star/introduction.html
并且主要使用以下伪代码:
frontier = PriorityQueue()
frontier.put(start, 0)
came_from = {}
cost_so_far = {}
came_from[start] = None
cost_so_far[start] = 0
while not frontier.empty():
current = frontier.get()
if current == goal:
break
for next in graph.neighbors(current):
new_cost = cost_so_far[current] + graph.cost(current, next)
if next not in cost_so_far or new_cost < cost_so_far[next]:
cost_so_far[next] = new_cost
priority = new_cost + heuristic(goal, next)
frontier.put(next, priority)
came_from[next] = current
我的问题是:在具有大型程序生成世界的2D-sidescroller中,我该如何选择边界?特定图块的路径可以是任何距离,迭代整个地图显然是不明智的。
我正在努力做到这一点,所以任何帮助都会受到赞赏!
答案 0 :(得分:1)
我从来没有听说过它被称为&#34; frontier&#34;它始终是&#34;打开列表&#34;你把所有可以前往的地方 - 邻居放在那里。
我使用的性能方面:
1)将计算放在另一个线程中:(不是常规)在这里查看ThreadedJob
http://answers.unity3d.com/questions/357033/unity3d-and-c-coroutines-vs-threading.html
它会产生延迟 - 结果将是你打电话后的几帧,或者:a)等待; b)开始沿目标的大致方向前进,并在结果准备好后改变路径; c)转到路径的第一个节点,即使剩下的还没有准备好。
2)缓存结果:Dictionary<Vector4, List<Vector2>> pathCache;
其中键,Vector4为startPosX
,startPosY
,finishPosX
,finishPosY
,值List为A *的结果。
由于路径是对称的,因此当您查找从A到B的路径时,还应检查B-> A的缓存并反转路径。