Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将多个单位的*路径分割为单独的游戏框架_C#_Xna_Path Finding_A Star - Fatal编程技术网

C# 将多个单位的*路径分割为单独的游戏框架

C# 将多个单位的*路径分割为单独的游戏框架,c#,xna,path-finding,a-star,C#,Xna,Path Finding,A Star,所以我的问题是,对于大量的单元组,试图在同一帧中为所有单元进行路径查找会导致相当明显的速度减慢。当路径为1或2个单位时,速度通常不会明显减慢,但根据路径的复杂性,速度可能会非常慢 虽然我的A*可能可以稍微调整一下,但我也知道另一种加速路径的方法是在多个游戏帧上分割路径查找。实现这一点的好方法是什么 我很抱歉,如果这是一个明显的或易于搜索的问题,我真的想不出如何将其放入一个可搜索的字串中 更多信息:这是一个直线网格上的*,使用C#和XNA框架编程。我计划有可能多达50-75个单位需要路径 谢谢。可

所以我的问题是,对于大量的单元组,试图在同一帧中为所有单元进行路径查找会导致相当明显的速度减慢。当路径为1或2个单位时,速度通常不会明显减慢,但根据路径的复杂性,速度可能会非常慢

虽然我的A*可能可以稍微调整一下,但我也知道另一种加速路径的方法是在多个游戏帧上分割路径查找。实现这一点的好方法是什么

我很抱歉,如果这是一个明显的或易于搜索的问题,我真的想不出如何将其放入一个可搜索的字串中

更多信息:这是一个直线网格上的*,使用C#和XNA框架编程。我计划有可能多达50-75个单位需要路径


谢谢。

可扩展性

有几种方法可以针对这种情况进行优化。首先,您可能不必拆分为多个游戏帧。在某种程度上,可伸缩性似乎是个问题。100台至少比1台贵100倍

那么,我们如何使路径更优化以实现可伸缩性呢?这取决于你的游戏设计。我将(可能错误地)假设一个典型的RTS场景。几组单元,每组相对靠近。许多邻近单元的路径解决方案将非常相似。单位可以从某种路径解算器请求路径。此路径解算器可以保留最近路径请求及其解决方案的表,并避免多次计算来自相同输入的相同输出。这就是所谓的

除此之外的另一个附加功能可能涉及从网格或图形中创建层次结构。首先在较简单的图形上求解,然后切换到更详细的图形。多个单元可以使用相同的低分辨率路径,利用记忆,但如果高分辨率路径太多而无法合理记忆,则每个单元可以单独计算自己的高分辨率路径

多帧计算

至于尝试在帧之间分割计算,有几种方法我可以马上想到

如果希望采用多线程路由,可以使用工作线程池模型。每次单元请求路径时,它都会排队等待解决方案。当工作线程空闲时,将为其分配要解决的任务。当线程解决任务时,您可以使用回调通知单元,或者如果任务以某种方式完成,则可以使用单元查询,最有可能是在每个帧中查询

如果没有动态障碍物或它们是单独处理的,则可以使用路径解算器使用的恒定状态。如果没有,那么将有一个不可忽略的复杂性,甚至可能无意中听到这些线程锁定可变的游戏状态信息。从一个帧到下一个帧的路径可能被呈现为无效,并且每个帧都需要重新验证。多线程可能最终成为一种毫无意义的额外开销,因为锁定和同步,线程很少并行运行。这只是一种可能性

或者,您可以设计以离散步骤运行的路径查找算法。在n个步骤之后,检查自算法启动以来经过的时间量。如果超过一定时间,路径算法将保存其进度并返回。然后调用代码可以检查算法是否完成。在下一帧中,从原来的位置恢复路径算法。重复上述步骤,直到问题解决

即使使用单线程的、自愿的路径解决方法,如果游戏状态的变化影响到从帧到帧的路径的有效性,您也将不得不在一个框架到一个框架的基础上重新验证当前解决方案

使用部分解决方案


使用上述任何一种方法,您都可能遇到这样的问题:在获得完整的路径解决方案之前,单元被命令去某个地方空转多帧。在典型情况下,这可能是可以接受的,实际上是无法检测到的。如果不是,您可以尝试按原样使用不完整的解决方案。如果每个不完整的解决方案差异太大,那么单元的行为将相当不确定。在实践中,这种“犹豫不决”的情况也可能不会经常发生而引起关注。

如果你的部队都在通往同一个目的地,这个答案可能是适用的,否则,它只会引起思考

我使用广度优先的距离算法来计算路径单位。从目标开始,并将距离标记为0。任何相邻单元为1,相邻单元为2,等等。不要穿过障碍物,并穿过整个电路板。通常是O(A)时间复杂度,其中A是电路板区域

然后,无论何时,只要你想确定一个单位需要走的方向,你只需找到距离目的地最小的正方形。O(1)时间复杂度


我将经常在塔防游戏中使用这种路径算法,因为它的时间复杂度完全取决于棋盘的大小(在TD游戏中通常相当小),而不是单位的数量(通常相当大)。它允许玩家定义自己的路径(这是一个很好的功能),由于游戏的性质,我只需要一轮运行一次。

你的a*搜索是什么,a网格?您是否考虑过使用*进行“局部搜索”的地标标记?我从未听说过这种方法,但我刚刚想到的另一种加速方法是降低网格的分辨率,这样在找到路径之前就没有那么多节点需要遍历了。你可以改进分辨率,并在实体通过路径时对路径进行某种迭代平滑。第六,你能更具体一点吗?请解释一下你所说的“标记”,