在《星际争霸》之类的游戏中,地图中最多可以有200个单位(对于玩家)。
既有小地图又有大地图。
例如,当您抓取50个单位并告诉他们去地图的另一侧时,一些算法开始执行,他们找到穿过障碍物(河流,丘陵,岩石等)的路径。
我的问题是,您是否知道游戏不会减速,因为您有50条计算路径。同时,其他事情也会发生,例如无人机收集矿物质,建筑物等。而且,如果地图很大,它应该会变得越来越困难和缓慢。
因此,即使算法很好,100个单位也要花费一些时间。
您知道这是如何工作的,也许算法类似于其他游戏。
正如我所说,当您告诉部队移动时,您没有看到计算路径的任何延迟-它们开始立即驶向目的地。
问题是它们如何使单位通过最短而又快速的路径。
大多数游戏(《星际争霸》,《魔兽争霸》等)都没有延迟
谢谢。
答案 0 :(得分:6)
我想这只是需要细分问题并记住结果。示例:2个单位。 Unit1从A到C,但最短路径经过B。Unit2从B到C。 B到C仅需要计算一次,并且两者都可以重用。 参见https://en.m.wikipedia.org/wiki/Dynamic_programming
在此Wikipedia页面中,它专门提到了dijkstra的路径查找算法,该算法通过细分问题并存储要重复使用的结果来发挥作用。
http://www.gamasutra.com/blogs/TylerGlaiel/20121007/178966/Some_experiments_in_pathfinding__AI.php处还有一个外观不错的替代方法,它考虑到了障碍物之类的动态内容,但效果仍然很好(视频演示:https://www.youtube.com/watch?v=z4W1zSOLr_g)。
另一种有趣的技术是完全不同的方法: 计算从目标位置到地图上每个点的最短路径:请参见此处的完整说明:https://www.youtube.com/watch?v=Bspb9g9nTto-尽管对于大型地图而言,这是无效的
答案 1 :(得分:4)
首先,这100个单元的数量不是很多,在现代计算机上寻路足够快,因此它并不是一个很大的资源库。即使在较旧的游戏上,也进行了优化以使其更快,并且您可以看到该单元有时会丢失或卡住,这对于像A *这样的通用算法来说是不应该发生的。
如果地图不更改地图,则可以对其进行预处理,以构建代表地图区域的一组节点。例如,如果地图是由一个狭窄的桥梁连接的两个岛,则将有三个“区域”-岛1,岛2,桥。实际上,您可能会使用某种图形算法而不是手动执行此操作。例如:
然后您的寻路算法分为两个阶段:
在遥远的位置之间移动时,这应该更快一些,因为您现在正在搜索几个节点(在区域图上)加上相对较少的图块,而不是组成这些区域的数百个图块。例如,如果我们有3个岛A,B,C,桥1和2分别连接AB和BC,那么从A到C的单位实际上并不需要每次都搜索B,它们只关心最短的方法从1号桥到2号桥。如果您有很多孤岛,那么实际上可以加快速度。
当然,问题是区域可能会由于例如建筑物遮挡路径或临时遮挡通道的单元而发生变化。解决方案取决于您的想象力。如果地图在您的游戏中很少更改,则您可以尝试在每次更改地图时仔细地更新区域图。或者,您可以让单位天真地信任区域图,直到它们遇到障碍。在某些游戏中,您会看到后者的特别糟糕的情况,因为即使围墙被围住,一个单元仍会继续向山谷奔跑,只有撞到墙后,它才会转回去绕行。我认为原始的星际争霸在单位阻塞狭窄路径时会遇到此问题。他们会尽量走很长的弯路,而不是等待人群腾出一座桥。
还有一些算法可以在不显式构建区域图的情况下完成类似的优化,例如JPS大致以这种方式工作。