我正在使用C#和MonoDevelop在Monotouch上制作iOS游戏。我有一个非常奇怪的崩溃。
背景资料:制作2D战争游戏。我已经实现了 Dijkstra算法来计算从源到目的地的最短路径,中间有对象(例如:从这里到那里,但绕过汽车/树木/建筑物/或任何方式自动)。我的崩溃似乎与我为Dijkstra算法的这个实现创建的2D字节数组有关。如果您从未听说过Dijkstra算法http://en.wikipedia.org/wiki/File:Dijkstras_progress_animation.gif
,请参阅此图片基本上,我在 2D阵列中拥有的节点越多,士兵在战场上的移动细节就越多。如果我在2D数组中使用2,400个节点,那么所有工作/加载都很好。但是,如果我将节点数增加到4,266以获得更详细的坐标,程序在计算节点距离时会崩溃。在崩溃之前完成大约30%。
有关崩溃的更多详细信息: 仅在时使用调试/ iPhone模式或发布/ iPhone模式时崩溃。当我使用Debug / iPhone模拟器时,它工作正常。另外注意,当我构建应用程序并使用Debug / iPhone模式将其传输到我的手机,然后停止调试器,打开XCode Instruments,它工作正常!我无法弄清楚为什么它可以在模拟器和XCode仪器中工作,但不能用于Monodevelop Debug / iPhone模式。 XCode Instruments是否正在做一些“修补”问题?或MonoDevelop的调试器是否正在“破坏”程序?
让我解释一下你在屏幕截图中看到的内容。我的应用程序被称为“战争游戏”。查看时间线,CPU使用率从大约2秒到大约35秒约为100%。当CPU使用率下降到零时,它就完成了加载。因此,加载2D节点阵列并用距离填充它们需要大约33秒。
请注意,在这个崩溃的实例中有4,266个节点,这意味着2D数组是一个字节[4266,4266]数组。所以2D阵列中的18,198,756字节。并且它在由XCode Instruments运行时成功加载,并且在MonoDevelop的Debug / iPhone模拟器中运行时成功加载。但是当我在iPhone 4s上以Debug / iPhone模式运行时,它崩溃并没有错误消息。屏幕截图中显示了此应用的内存使用量约为60.73MB。
在不崩溃的实例中,有2,400个节点,这意味着2D数组是一个字节[2400,2400]数组。这就是2D阵列中的5,760,000个字节。那个人到处工作都很好。
问题显然似乎是,当我将节点数增加到大约4,266或更多时,程序崩溃了。但我没有收到错误消息,它只是在加载时突然停止... 这可能是垃圾收集问题吗?您认为我会收到错误消息吗? 这可能是一个“内存不足”的问题吗?但是当它使用XCode的仪器加载它说我只使用60MB,并且我在此应用程序中使用了高达150MB作为测试之前,所以我知道我至少可以使用150MB的内存,然后崩溃并出现“内存不足错误”。
以下是XCode Instruments
的内存分配照片以下是XCode Instruments
的内存泄漏页面答案 0 :(得分:1)
这很奇怪。它看起来像一个调试器错误,在使用调试器时可能是内存不足的情况(因为这需要比普通构建更多的内存)。
然而,您应该可以手动启动发布版本而不会出现问题...就像使用Xcode的工具一样。
我怀疑游戏中存在一个问题。例如。启动应用程序需要很长时间,监视器会将其杀死(对于发布版本)。从Xcode的仪器开始,这仍然有效,因为它将沉默看门狗。
如果没有更多信息(不适合stackoverflow),我就无法更精确。我建议你打开bug report并附上调试版本(由MonoDevelop启动)和发布版本(手动启动)的崩溃日志。