2008-11-11 83 views
1

我正在开发一个.NET CF 3.5网络游戏。我的问题是应用程序在第一个实例加载所有资源。然而,随后发布时,该应用程序在加载资源(尤其是声音或大图像)时使我的内存摆脱了异常。.NET CF应用程序和内存不足异常

请指导我

回答

2

我假设你并没有试图一次推出多个游戏实例。这听起来像游戏关闭后内存不会返回到操作系统。一个简单的方法,以确定是否有泄漏:

  1. 重启设备
  2. 检查内存使用
  3. 开始你的游戏,玩了几分钟
  4. 关闭游戏
  5. 等待几分钟,然后再次检查内存使用情况

如果在内存不足之前可以启动几次启动,则会有小的泄漏。如果在重新启动设备之前只能启动一次,那么您的设备很大。垃圾收集只会走得这么远。如果您对非托管代码(实例化非托管对象的Win32或PInvoke调用)进行任何调用,那么您需要确保在游戏关闭时释放这些资源。

+0

戴夫, 谢谢,该应用程序没有正确关闭(任务管理器也没有显示它)。有一个正在执行的连接线程!所以我想它让应用程序进入后台,所以它不能正常退出。中止线程后,问题不会发生! – Azlam 2008-11-18 05:27:51

0

加载所有资源后应用程序占用多少内存?在默认设置下,我一直在通过cca 1.3 GB专用字节(检查任务管理器和进程内存分配)获取此错误。

+0

1.3 GB?是否确定它是在.NET CF – Azlam 2008-11-11 17:40:55

0

Microsoft为我们提供了CLR Profiler,一种用于分析受管应用程序的行为的工具,您可以下载here。它是用于.NET 2.0的CLR Profiler,但它将与.NET 3.5一起工作,因为CLR没有改变。

0

也许问题的一部分是.NET CF不能很好地处理Windows CE的内存模型。 (大内存分配失败,即使那么多可用的内存溢出的例外,我不知道这个神奇的数字事情开始打破...)

下面是一些细节: .Net Compact Framework Advanced Memory Management

的最简单的方法是将内容复制到RAM磁盘(例如\ temp);计划B是使用链接Marshal.AllocHGlobal或P/Invoke VirtualAlloc(可怕!)以及GCHandle.Pin的东西

0

基于使用.NET CF进行编程的经验,正如普通的桌面/ PC环境所预期的那样。

在我的应用程序中,通过在对象超出范围之前始终调用Close()和Dispose()方法来解决我遇到的内存不足异常问题。

如果仍有问题,另一种尝试此方法的方法是挂接到应用程序关闭事件处理程序并调用GC.Collect()。这将迫使垃圾收集器立即收集所有未使用或处置的对象。