2013-07-07 47 views
6

我有一个C#应用程序组成的一个枢轴与多个数据透视图。正常的Pivotitems正常卸载并且不会泄漏内存。在两个项目上,我有Drawingsurfaces,我使用Monogame来渲染3D模型。在卸载和加载它们的支点时,我试图完全摧毁并完全重新创建“游戏”实例(主要是因为Monogame目前不允许您画两个表面,并且因为它们使用了大量内存,对他们来说都不够)。C#如何从内存中完全删除对象

我的问题来了,当我处理加载时创建的Xamlgame不释放它使用的所有内存。这意味着每次我重新创建Xamlgame时,它都会开始使用越来越多的内存,直到不再有剩下的内存。因此,我想知道是否有任何C#方式来完全处理加载对象时使用的所有内存。

任何Monogame的具体方式也将不胜感激。目前我首先处理顶点和索引缓冲区,然后清除我的顶点和索引列表,然后处理我的Basiceffect和GraphicsdeviceManager,然后我调用“游戏”本身并最终创建变量包含等于null的“游戏”。

PS。如果你曾经在XNA上做过这些,那么你也可以帮助我,因为它的语法基本相同。

EDIT(可能是MonoGame错误):

我现在已经成功地正确地清理所有缓冲区等起来。尽管我的BasicEffect仍然有内存泄漏。我已经试过配置它并将其设置为空,但无论它每次重新加载我的数据透视表时是否一直使用越来越多的内存。

+0

如果您正在处理所有'IDisposable'资源,那么['GC.Collect'](http://msdn.microsoft.com/zh-cn/library/System.GC.Collect.aspx)不会工作? – Romoku

+0

我打电话给它,但它似乎没有效果 – Gerharddc

+0

你确定你正在处理所有的连接和项目吗?你能分享你的代码吗? –

回答

-2

显然,MonoGame根本不支持在游戏中多次创建,并且在执行此操作时会泄漏内存。更复杂一点的是只使用一个游戏实例并更改它正在绘制的面板。

6

使用垃圾回收器并等待最终确定它。

  GC.Collect(); 
      GC.WaitForPendingFinalizers(); 
4

首先,您需要将值设置为null所以它不再使用:

XamlGame = null 

然后你就可以激活垃圾收集器:

GC.Collect(); 
GC.WaitForPendingFinalizers(); 

如果不会处理比XamlGame对象不为null或其引用仍然被另一个对象保留的情况。

请记住,如果XamlGame继承自游戏类,您将无法处理它,因为它包含保持整个游戏应用程序活着的正在运行的执行循环。如果你处理它,应用程序将崩溃并终止。

相关问题