首先,100 个单位并不是一个很大的数字,现代计算机上的寻路速度足够快,它不是一个大的资源汇。即使在较旧的游戏中,也进行了优化以使其更快,并且您可以看到该单元有时会丢失或卡住,而像 A* 这样的通用算法不应该真正发生这种情况。
如果地图没有改变地图,您可以对其进行预处理以构建一组表示地图区域的节点。例如,如果地图是由一座窄桥连接的两个岛屿,则将存在三个“区域”——岛屿 1、岛屿 2、桥梁。实际上,您可能会使用一些图形算法而不是手动执行此操作。例如:
- 用距离最近的不可通过的瓷砖对每块瓷砖进行评分。
- 将分数高于阈值的所有相邻图块放在同一区域中。
- 完成后,逐渐从所有区域向外扩展以包含低分图块。
- 制作一个新图,其中每个区域-区域交叉点都是一个节点,并计算它们之间的最短路径。
那么你的寻路算法就变成了两个阶段:
- 找出单位所在的地区。
- 找出目标所在的区域。
- 如果区域不同,首先使用上面的区域图计算到目标区域的最短路径。
- 一旦进入同一区域,在平铺网格上正常计算路径。
在遥远的位置之间移动时,这应该会更快,因为您现在正在搜索少数节点(在区域图上)加上相对较少数量的图块,而不是组成这些区域的数百个图块。例如,如果我们有 3 个岛 A、B、C,分别有桥 1 和 2 连接 AB 和 BC,那么从 A 移动到 C 的单元并不需要每次都搜索 B,它们只关心最短路径从桥 1 到桥 2。如果你有很多岛屿,这真的可以加快速度。
当然,问题是区域可能会由于例如建筑物阻塞路径或单元暂时阻塞通道而发生变化。解决方案取决于您的想象力。如果地图在您的游戏中很少更改,您可以尝试在每次更改地图时仔细更新区域图。或者你可以让单位天真地信任区域图,直到他们遇到障碍。在某些游戏中,您会看到后者特别糟糕的情况,因为即使在被围墙关闭后,单位仍会继续向山谷奔跑,并且只有在撞到墙后才会转身并绕行。我认为当单位阻挡狭窄的路径时,最初的星际争霸会出现这个问题。他们会尝试绕一段很长的弯路,而不是等待人群腾出一座桥。
还有一些算法可以在不显式构建区域图的情况下完成类似的优化,例如JPS大致以这种方式工作。