我花了几个星期都在用自定义的C++引擎尝试解决寻路问题。 我想要让数百个单位在复杂地形上移动而不会变成一团糟的、卡顿的、颤抖的玩意儿,并且不会让游戏卡死。

我尝试了很多种方法来让它工作。

领导者追随陷阱是最糟糕的。 我让单位跟随领导者的路径。 它在纸上看起来很高效,但响应性却很差。 单位会等待领导者移动,然后尝试瞬间移动到领导者的旧位置。 这感觉就像我在玩一个有半秒钟输入延迟的游戏。

然后我玩了BFS vs A*的游戏。 我尝试使用BFS来短距离移动以节省循环,但当单位数量达到40+时游戏就会卡死。 我又回到了A*,但这次加了10ms的限制,但如果目标太远,单位就会停止死在那里。

突破发生在我停止尝试强迫所有单位都要到达目的地的相同坐标时。 单个点逻辑是创建单位推挤彼此、重新计算和CPU飙升的死亡螺旋的原因。

因此我建立了Master Path系统。

  1. 单位共享一个高速公路来穿越地图。
  2. 每个单位都会运行自己的本地切片A*来跟随高速公路。
  3. 一旦他们到达最终目的地,我就不再尝试强迫他们形成队列。 我只让他们停在那里。 如果目标位置被占据,他们会查看附近的位置并选择第一个空位置。

我有一个垃圾的sanity检查,拒绝任何A*路径如果它会从目标位置移动。 我强迫数学变得完美,而不是让单位只是移动。 我杀死了这个检查,现在它们流动得非常好。

现在,即使是数百个单位也不会卡顿。 重算MasterPath的路径很便宜,移动很响应的,单位也不再争夺相同的像素。

任何其他人在尝试解决RTS移动问题时,都应该停止让单位成为领导者的完美同步奴隶。 给他们一个目标,给他们一个高速公路,让他们停在那里。

有人在自定义RTS运动逻辑吗? 你的寻路策略是什么?