【问题标题】:C# How to completely remove object from memoryC#如何从内存中完全删除对象
【发布时间】:2013-07-07 06:43:36
【问题描述】:

我有一个 C# 应用程序,它由一个带有多个 Pivotitem 的 Pivot 组成。正常的 Pivotitems 会正确卸载并且不会泄漏内存。不过,在其中两个项目上,我有使用 Monogame 渲染 3d 模型的绘图表面。在卸载和加载它们的枢轴时,我试图完全破坏然后完全重新创建“游戏”实例(主要是因为 Monogame 目前不允许您绘制到两个表面,并且因为它们使用大量内存并且有两个都不够)。

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

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

PS。如果您曾经在 XNA 中这样做过,那么您也可以帮助我,因为语法基本相同。

编辑(可能是 MonoGame 错误):

我现在已成功清理所有缓冲区等。我的 BasicEffect 仍然存在内存泄漏。我已经尝试处理它并使其为空,但无论如何它每次重新加载我的枢轴时都会使用越来越多的内存。

【问题讨论】:

  • 如果您要处理所有IDisposable 资源,那么GC.Collect 不起作用吗?
  • 我正在调用它,但它似乎没有效果
  • 您确定要处理所有连接和项目吗?你能分享你的代码吗?
  • 好的,然后看Force garbage collection of arrays, C#。您可能需要预先分配大块内存以帮助 GC 优化大对象堆。
  • MonoGame 内部的某些东西可能挂在内存上。你可以在你的代码上运行内存分析器来找到它吗?特别是,静态引用往往是万恶之源。看一下 Game 类的实现,它有一个对自身的内部静态引用。 github.com/mono/MonoGame/blob/develop/MonoGame.Framework/…

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


【解决方案1】:

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

 XamlGame = null

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

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

如果 XamlGame 对象不为 null 或对它的引用仍由另一个对象持有,则它未释放。

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

【讨论】:

  • 应该注意大多数人不应该这样做,除非你有像这样的极端情况。垃圾收集很昂贵,并且会在收集时冻结您的程序
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-29
      • 1970-01-01
      相关资源
      最近更新 更多