CLR事件探查器分配的字节和XNA ContentManager

我一直与XNA ContentManager和内存分配战斗了几个星期,因为我试图将我的游戏从XNA(Windows)移植到ExEn / Monotouch(iphone)。

问题是玩了几个关卡之后,我的游戏在一个真正的iPhone设备(而不是模拟器)上意外退出。

用CLRProfile分析Windows上的内存使用情况,我发现一些有用的东西,但我也发现了一些我不明白的东西。 如果我使用2个ContentManagers(1个用于共享资源,1个用于关卡资产),那么在分析时,“分配的字节数”增长并且在级别级别之后增长,但是由Windows任务管理器测量的内存消耗保持不变(当我卸载内容管理器时当我加载内容时再次)。 显然,我levelManager.Unload()级别结束时。 几个级别后,我的游戏意外退出iPhone设备。

如果我使用1个内容管理器,“CRLProfiler Allocated Bytes”在Windows和iPhone上保持不变, 我可以正常玩游戏,并没有意外退出。 我使用相同的资产级别。

它似乎在ios(iPhone)加载和卸载相同的资产时,它分配内存并消耗所有设备的内存,所以ios杀死它。

任何人都可以解释我是如何工作的?
我读了不less,但我还是不明白发生了什么事。

垃圾收集器可能以不可预知的方式工作。 你可能想在你的级别加载逻辑结尾做一个GC.Collect()来确保释放所有的可释放内存。 我不知道在模拟器或设备上的GC行为是否有任何区别,但要确保通过对所有对它的引用和内容本身的引用来简化ContentManager的收集。

您可能希望在实际设备上运行时使用Instruments概要分析工具(或其他的CLR概要分析器?)来检查内存分配/释放模式,并确定它是否确实是与内存相关的问题。

作为一个经验法则,你应该避免在游戏过程中分配内存(提前创建所有的游戏对象或者拥有游戏池),这样你可以避免在游戏被认为是互动的时候不小心触发了GC。

最后,通过删除所有的游戏逻辑,显示,任何不需要的东西来使整个事情崩溃,并确保它仍然崩溃,尽量减less你的问题到一个最小的可重复的testing案例。 这应该帮助你find你做错了什么,或者帮助你findMonoTouch / ExEn /你可能使用的任何其他框架中可能存在的错误。