电子游戏路径寻路的 A* 技巧

游戏开发者和算法爱好者正在交流各种技巧,让 A* 寻路在从小型 2D 游戏到大型 RTS 战斗和城市建设类游戏中都能做到快速、可信且可扩展。他们讨论层次化图、启发式调整、替代数据结构,以及流场、转向行为和群体级路径等混合方法,以应对动态障碍、大量智能体和对地图的有限认知。一些评论者还提到更高级或更专门的方法——收缩层次、差分启发式、基于 RL 的方法以及 GOAP 风格规划——强调像寻路这样一个“已经解决”的问题,实际上仍隐藏着很深的设计与优化空间。

强化学习 vs. 经典寻路

  • 有人想知道,一个小型 RL 策略(NN 或决策树)是否可以取代 A*,也许还能减少手工处理的边缘情况。
  • 也有人认为,它只会学出一个更糟的 A*,而且失败更难调试,这反映了人们对不透明的学习系统的普遍不安。

超越基础 A* 与研究方向

  • 文中提到了多种高级方法:收缩层次、时间相关变体、层次化搜索、双向 A*、地标、reach、transit nodes、arc flags、差分启发式等等。
  • 还引用了多篇综述论文、讲座和演讲;其中一些被认为已经过时,并有人声称这一领域进展迅速。

让“聪明”敌人更像真的行为技巧

  • 延迟重新寻路和随机化更新间隔会让敌人看起来会“犹豫”或可被诱骗,同时也能节省 CPU。
  • 目标设置为玩家前方的格子会产生“截击”行为(例如类似吃豆人幽灵那样)。
  • 将 A* 路径作为转向的引导(切角、平滑)以及使用面包屑/费洛蒙轨迹,能产生更自然的运动。

层次化、大规模与多智能体导航

  • 层次化图(城市 / 建筑 / 房间,或街道 vs 室内)被广泛用于保持查询速度。
  • 对于大量敌人,建议从玩家位置运行 Dijkstra,然后让每个敌人沿着梯度移动。
  • 大规模阵型游戏(RTS、Total War 风格)会把远距离寻路与局部人群模拟分开;逐单位 A* 被认为既浪费又不真实。
  • 流场以及 flocking/steering 被提议用于群体移动。

性能与数据结构优化

  • 技巧包括:分桶优先队列、将搜索元数据存储在节点上、异步/后台线程寻路、限制每帧处理的节点数,以及全对全预处理(例如在小型网格上使用 Floyd–Warshall)。
  • MPAA(multipath adaptive A*)因可增量复用而受到称赞;JPS(jump point search)则因开销问题评价不一。

地图表示、代价与边缘情况

  • 关于基于像素还是基于格子的搜索存在争论;当移动与格子对齐时,格子能减少工作量,但在其他情况下可能需要更细粒度的像素。
  • 预计算元数据(到最近障碍物的距离、出口位掩码)可以加速碰撞检测和寻路。
  • 处理传送器、不同地形代价、凸区域以及多种移动模式被认为很棘手。
  • A* 的平局打破、C 形障碍,以及“永不放弃”式搜索被指出是常见陷阱,且引用了真实游戏中的 bug(例如怪物或动物永远卡住)。

A* 不只是用来移动

  • A* 及相关搜索也被应用于决策/规划图(GOAP、策略搜索),而不仅仅是空间地图,从而为游戏 AI 带来统一的“规划”感觉。