C# 使用Dijkstra';s算法与二维阵列

C# 使用Dijkstra';s算法与二维阵列,c#,ios,xamarin.ios,monodevelop,xcode-instruments,C#,Ios,Xamarin.ios,Monodevelop,Xcode Instruments,我正在用C#和MonoDevelop制作一个iOS游戏。我有一个非常奇怪的碰撞 背景信息:制作2D战争游戏。我已经实现了Dijkstra的算法来计算从源到目的地的最短路径,对象在两者之间(例如:从这里到那里,但自动绕过汽车/树木/建筑物/或任何东西)。我的崩溃似乎与我为Dijkstra算法的这个实现创建的2D字节数组有关。如果您从未听说过Dijkstra的算法,请参见此图 基本上,我的2D阵列中的节点越多,士兵在战场上的移动就越详细。如果我在2D阵列中使用2400个节点,则一切都可以正常工作/加

我正在用C#和MonoDevelop制作一个iOS游戏。我有一个非常奇怪的碰撞

背景信息:制作2D战争游戏。我已经实现了Dijkstra的算法来计算从源到目的地的最短路径,对象在两者之间(例如:从这里到那里,但自动绕过汽车/树木/建筑物/或任何东西)。我的崩溃似乎与我为Dijkstra算法的这个实现创建的2D字节数组有关。如果您从未听说过Dijkstra的算法,请参见此图

基本上,我的2D阵列中的节点越多,士兵在战场上的移动就越详细。如果我在2D阵列中使用2400个节点,则一切都可以正常工作/加载。但是,如果我将节点数增加到4266以获得更详细的坐标,程序在计算节点距离时会崩溃。它在崩溃前大约完成了30%

有关崩溃的更多详细信息:它仅在使用调试/iPhone模式或发布/iPhone模式时崩溃。当我使用Debug/iPhone模拟器时,它工作得很好。另一个注意事项是,当我构建应用程序并使用Debug/iPhone模式将其传输到我的手机上,然后停止调试器,打开XCode Instruments,它工作正常!我不明白为什么它可以在模拟器和XCode工具中工作,但不能在Monodevelop调试/iPhone模式下工作。XCode仪器是否在“修补”问题?或者MonoDevelop的调试器正在“破坏”程序

让我解释一下你在截图中看到了什么。我的应用程序叫做“战争游戏”。查看时间线,CPU使用率约为100%,从2秒到35秒不等。当CPU使用率降至零时,就完成了加载。因此,加载2D节点阵列并用距离填充它们实际上需要33秒

请记住,在本例中有4266个节点,这意味着2D数组是一个字节[42664266]数组。在2D数组中是18198756字节。它在XCode仪器上运行时成功加载,在MonoDevelop的调试/iPhone模拟器上运行时成功加载。但在我的iPhone4S上以调试/iPhone模式运行时,它会崩溃,并且没有错误消息。该应用程序的内存使用量约为60.73MB,如屏幕截图所示

在没有崩溃的实例中,有2400个节点,这意味着2D数组是一个字节[24002400,2400]数组。这就是一个2D数组中的5760000字节。而且这个在任何地方都很好用

问题显然是,当我将节点数增加到4266个或更多时,程序崩溃。但我没有收到错误信息,它只是在加载时突然停止这可能是垃圾收集问题吗?您认为我会因此收到错误消息,对吗这可能是一个“内存不足”问题吗?但是当它使用XCode的仪器加载时,它说我只使用了60MB,而且我以前在这个应用程序中使用了高达150MB的内存作为测试,所以我知道在它因“内存不足错误”崩溃之前,我至少可以使用150MB的内存

这是一张来自XCode仪器的内存分配的快照


这是一张来自XCode Instruments的内存泄漏页面的快照,这很奇怪。它看起来像是一个调试器bug,在使用调试器时可能出现内存不足的情况(因为这将需要比正常构建更多的内存)

但是,您应该能够手动启动版本构建,而不会出现问题。。。就像使用Xcode的仪器一样

我怀疑有不止一个问题在起作用。例如,启动应用程序花费的时间太长,而看门狗会将其杀死(用于发布构建)。当从Xcode的仪器启动时,这仍然有效,因为它将使看门狗静音


如果没有更多的信息(不适合stackoverflow),我将无法更精确地解释。我建议您打开并附加调试版本(由MonoDevelop启动)和发布版本(手动启动)的崩溃日志。

这很奇怪。它看起来像是一个调试器bug,在使用调试器时可能出现内存不足的情况(因为这将需要比正常构建更多的内存)

但是,您应该能够手动启动版本构建,而不会出现问题。。。就像使用Xcode的仪器一样

我怀疑有不止一个问题在起作用。例如,启动应用程序花费的时间太长,而看门狗会将其杀死(用于发布构建)。当从Xcode的仪器启动时,这仍然有效,因为它将使看门狗静音


如果没有更多的信息(不适合stackoverflow),我将无法更精确地解释。我建议您打开并附加调试版本(由MonoDevelop启动)和发布版本(手动启动)的崩溃日志。

您使用的是递归方法还是迭代方法?我遇到过MonoDeveloper调试器在遇到堆栈溢出时崩溃的问题。它只有在使用Debug/iPhone模式或Release/iPhone模式时才会崩溃。由MonoDevelop安装但在设备上手动启动的版本是否有效?是否?由MonoDevelop安装但在设备上手动启动的发布版本不起作用。但是,如果我执行由MonoDevelop安装的构建版本,则使用XCode Instruments启动该应用程序,然后关闭该应用程序。然后关闭XCode Instruments并手动启动设备上的应用程序,它确实可以工作。。。。奇怪吧?几乎就好像XCode Instruments修复或绕过了一个问题……递归或迭代:我不是100%,但我只是查找了递归与迭代函数的示例,似乎我在使用迭代函数。我没有任何函数在厕所中调用它们自己