Memory 统一-更换场景后记忆不会减少

Memory 统一-更换场景后记忆不会减少,memory,unity3d,Memory,Unity3d,很抱歉把这个贴在这里,但我很绝望 我们似乎有一堆在加载新场景时无法释放的内存。当前加载过程从1级开始,使用单例加载屏幕加载到空场景中,然后调用System.GC.Collect();和资源。UnloadUnusedAssets();(以防万一)然后加载下一级。但是级别只会使内存的大小增加,即使在重新加载现有场景时,内存也只会增加 以下是发生的情况的简要概述: 加载到集线器区域大约从59000K开始(根据任务管理器内存使用情况)。这看起来还可以,因为这是一个三维漫游区域 转换到空场景后(通过上面

很抱歉把这个贴在这里,但我很绝望

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

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

  • 加载到集线器区域大约从59000K开始(根据任务管理器内存使用情况)。这看起来还可以,因为这是一个三维漫游区域
  • 转换到空场景后(通过上面的),程序仍保持在405000K
  • 启动后,第一个实际级别的内存为840000K
  • 再次加载回空场景后,内存为750000K
  • 在开始一个新的关卡(关卡2)后,它跳到1195000K
  • 在加载回上述空场景后,内存为1010000K
  • 然后回到数据中心(通过上面的加载转换),内存为1227000k
我不认为这是unity资产泄漏,因为我已经完成了清理程序网格/材质的工作,在空加载屏幕中,我查找了UnityObject存在的内容,它只有以下内容(在上述过程之后):

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

我不知道它们是否是问题所在,或者是否是编辑器的问题,但是否有任何方法可以跟踪创建渲染纹理的内容

我们发现,加载到boss级别,然后返回中心区域实际上会减少内存(从boss->HUB区域返回后大约为800MB)。但我不知道为什么会触发记忆被清除

目前在Unity 5.5.0f3上

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


谢谢

您应该使用Unity附带的探查器来评测应用程序。 基于这一点,你应该能够弄清楚是什么拥抱了记忆

如果您使用地图集,您需要确保充分使用它们:只有使用sprite或2(例如UI)才能加载整个地图集。在这种情况下,最好将地图集拆分为较小的地图集

您可能还需要确定代码的某些部分是否保留对资产的引用。如果他们这样做了,并且纸条在改变场景后幸存下来,那么你将得到“泄漏”的内存


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

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

如果您使用地图集,您需要确保充分使用它们:只有使用sprite或2(例如UI)才能加载整个地图集。在这种情况下,最好将地图集拆分为较小的地图集

您可能还需要确定代码的某些部分是否保留对资产的引用。如果他们这样做了,并且纸条在改变场景后幸存下来,那么你将得到“泄漏”的内存


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

任务管理器内存显示可能有点误导。与任何具有托管内存运行时的应用程序一样,Unity可能已经在内部“释放”了内存,而没有将其返回给操作系统。通过使用内存探查器(如)。您解决了内存问题了吗?我也有类似的问题任务管理器内存显示可能有点误导。与任何具有托管内存运行时的应用程序一样,Unity可能已经在内部“释放”了内存,而没有将其返回给操作系统。通过使用内存探查器(如)。您解决了内存问题了吗?我也遇到了类似的问题上面的内存快照图片/链接表明它主要是:对象、ManagedHeap.ReservedUnusedSize、ManagedHeap.Used Size。但这些都是非常普遍的,有没有办法从unity获得更多的细节?unity通常什么时候不释放内存?有办法强制执行吗?上面的内存快照图片/链接表明它主要是:对象、ManagedHeap.ReservedUnusedSize、ManagedHeap.Used Size。但这些都是非常普遍的,有没有办法从unity获得更多的细节?unity通常什么时候不释放内存?有办法强迫它吗?