我正在开发一个 .NET CF 3.5 网络游戏。我的问题是应用程序首先加载所有资源。然而,在随后的启动中,该应用程序在加载资源(尤其是声音或大图像)时给了我内存异常。
请指导我
我正在开发一个 .NET CF 3.5 网络游戏。我的问题是应用程序首先加载所有资源。然而,在随后的启动中,该应用程序在加载资源(尤其是声音或大图像)时给了我内存异常。
请指导我
我假设您没有尝试一次启动多个游戏实例。这听起来像是游戏关闭后内存没有返回到操作系统。确定是否有泄漏的一种简单方法是:
如果您可以在内存不足之前进行几次启动,那么您就会有少量泄漏。如果您在重新启动设备之前只能启动一次,那么您就有了一个大的。垃圾收集只会到此为止。如果您正在对非托管代码进行任何调用(Win32 或 PInvoke 调用实例化非托管对象),那么您需要确保在游戏关闭时释放这些资源。
加载所有资源后,您的应用程序占用了多少内存?在默认设置下,我收到这个错误来自 cca 1.3 GB 的私有字节(检查任务管理器和进程内存分配)。
Microsoft 为我们提供了 CLR Profiler,这是一种用于分析托管应用程序行为的工具,您可以在此处下载。它是 .NET 2.0 的 CLR Profiler,但它可以与 .NET 3.5 一起使用,因为 CLR 尚未更改。
部分问题可能是 .NET CF 不能很好地处理 Windows CE 的内存模型。(即使有那么多可用的内存分配失败,也会出现 OutOfMemory 异常;我不知道事情开始中断的神奇数字......)
以下是一些细节: .Net Compact Framework 高级内存管理
解决它的最简单方法是将内容复制到 ram 磁盘(例如 \temp);计划 B 是使用链接 Marshal.AllocHGlobal 或 P/Invoke VirtualAlloc(可怕!)以及 GCHandle.Pin
根据使用 .NET CF 进行编程的经验,您会受到内存限制,并且垃圾收集与普通桌面/PC 环境中的预期不同。
在我的应用程序中,通过始终在对象超出范围之前调用 Close() 和 Dispose() 方法解决了我遇到的内存不足异常的问题。
如果您仍然有问题,另一种尝试方法是连接到应用程序关闭事件处理程序并调用 GC.Collect()。这将强制垃圾收集器立即收集所有未使用或已处置的对象。