C#如何从内存中完全删除对象

时间:2013-07-07 06:43:37

标签: c# xna windows-phone-8 windows-phone monogame

我有一个C#应用程序,包含一个带有多个数据透视的Pivot。正常的数据透视表正确卸载并且不会泄漏内存。在其中的两个项目中,我有Drawingsurfaces,我使用Monogame来渲染3d模型。在卸载和装载他们的枢轴时,我试图完全破坏,然后完全重新创建“游戏”实例(主要是因为Monogame不允许你现在绘制到两个表面,因为他们使用了大量的内存,并且对他们两个来说都不够。)

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

任何Monogame特定方式也将受到赞赏。目前我首先处理我的顶点和索引缓冲区,然后我清除了我的顶点和索引列表,然后我处理了我的Basiceffect和我的Graphicsdevicemanager,然后我在“游戏”本身上调用dispose,最后我创建了变量包含等于null的“游戏”。

PS。如果您曾在XNA中完成此操作,那么您也可以帮助我,因为语法基本相同。

编辑(可能是MonoGame错误):

我现在已经设法正确清理所有缓冲区等。但是我的BasicEffect仍然存在内存泄漏。我已经尝试将它处理掉并使其为null,但不管它每次重新加载我的轴时它还在使用越来越多的内存。

3 个答案:

答案 0 :(得分:6)

使用垃圾收集器并等待完成它。

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

答案 1 :(得分:4)

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

 XamlGame = null

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

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

如果它没有处置,则XamlGame对象不为null,或者对它的引用仍由另一个对象持有。

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

答案 2 :(得分:-2)

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