【问题标题】:Unity - Memory not decreasing after changing scenesUnity - 改变场景后内存不会减少
【发布时间】:2017-02-23 17:30:31
【问题描述】:

很抱歉在这里发布,但我很绝望。

我们似乎有一堆内存在加载新场景时没有被释放。当前加载过程从 1 级开始,使用单例加载屏幕加载到空场景中然后调用 System.GC.Collect();和 Resources.UnloadUnusedAssets(); (以防万一)然后加载下一个级别。但是关卡只会增加内存大小,即使重新加载现有场景,内存也只会增加。

以下是所发生情况的简要概述:

  • 加载到 HUB 区域开始大约为 590,000K(根据任务管理器内存使用情况)。这似乎没问题,因为它是一个 3D 步行区域
  • 在转换到空场景后(通过上述方法),程序仍保持在 405,000K
  • 启动后第一个实际级别内存为 840,000K
  • 再次加载回空白场景后,内存为 750,000K
  • 在开始新的关卡(2 级)后,它会跳到 1,195,000K
  • 如上加载回空场景后,内存为 1,010,000K
  • 然后返回到 HUB 世界的 stat(通过上面的加载转换)内存为 1,227,000K

我不认为这是统一资源泄漏,因为我已经清理了程序网格/材质,并且在空加载屏幕中我查看了存在的 UnityObjects,它只有这个(在上述过程之后) :

Loading Scene Results

此时的内存快照如下所示:

Memory Snapshot

我不知道是它们的问题还是编辑器的问题,但有没有办法追踪创建渲染纹理的原因?

我们发现的一件事是加载到 Boss 关卡然后返回 HUB 区域实际上会减少内存(从 Boss -> HUB 区域后大约 800MB)。但我不确定为什么会触发内存被清除。

目前在 Unity 5.5.0f3 上

如果有人对为什么会发生这种情况有任何想法或可以提供帮助,我们将不胜感激。

谢谢

【问题讨论】:

  • 任务管理器内存显示可能有点误导。与任何具有托管内存运行时的应用程序一样,Unity 可能已经在内部“释放”了内存,而尚未将其返回给操作系统。通过使用能意识到这一点的内存分析器,您可能会获得更一致的结果,例如profiler built into Unity
  • 您的内存问题解决了吗?我也有类似的问题

标签: memory unity3d


【解决方案1】:

您应该使用 Unity 附带的分析器来分析应用程序。 基于此,您应该能够弄清楚是什么拥抱了记忆。

如果您使用图集,您需要确保充分使用它们:仅使用一个或 2 个精灵(例如 UI)会加载整个图集。在这种情况下,最好将图集拆分成更小的图集。

您可能还需要确定代码的某些部分是否保留了对资产的引用。如果他们这样做并且脚本在改变场景时仍然存在,那么您将获得“泄露”的内存。

要说明的另一点是,Unity 不会在您更改场景后立即释放内存。

【讨论】:

  • 上面的内存快照图片/链接表示主要是:Objects, ManagedHeap.ReservedUnusedSize, ManagedHeap.Used Size。但是这些非常笼统,有没有办法从统一中获得更多细节?什么时候统一通常不释放内存?有办法强制吗?
猜你喜欢
  • 1970-01-01
  • 2022-09-28
  • 2015-05-10
  • 1970-01-01
  • 2023-01-31
  • 2022-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多