要查看您的可执行文件、DLL和Mono虚拟机使用了多少内存,逐帧内存数字是不够的。使用详细快照捕获深入了解这种内存细分。
注意
:内存分析器模块详细视图中的引用树仅显示本地引用。从继承自
UnityEngine.Object
的对象的引用可能会显示其托管外壳的名称。然而,它们可能仅仅是因为它们下面有本地对象而显示。您不一定会看到任何托管类型。让我们以一个字段中有Texture2D的对象作为参考。使用此视图,您也不会看到哪个字段持有该引用。对于这种细节,请使用内存分析器包。
要在高层次上确定内存使用何时开始接近平台预算,请使用以下“草稿纸”计算:
系统使用内存(或如果系统使用显示为0则为总保留内存)+ 未跟踪内存的粗略缓冲区 / 平台总内存
当该数字开始接近您平台内存预算的100%时,请使用
内存分析器包
找出原因。
内存分析器模块的许多功能已被内存分析器包所取代,但您仍然可以使用该模块来补充您的内存分析工作。
例如:
-
要查找GC分配
:尽管这些在模块中显示,但使用
项目审计器
或深度分析更容易追踪。
-
快速查看堆的已用/保留大小
-
着色器内存分析
在设置内存预算时,请记住在具有最低规格的设备上进行分析,以满足您的整体目标平台。密切监控内存使用情况,牢记您的目标限制。
您通常希望使用具有大量可用内存的强大开发者系统进行分析(存储大型内存快照或快速加载和保存这些快照的空间很重要)。
内存分析与CPU和GPU分析是不同的,因为它本身可能会产生额外的内存开销。您可能需要在高端设备(具有更多内存)上分析内存,但特别要注意低端目标规格的内存预算限制。
分析内存使用时需要考虑的要点:
-
质量级别、图形层级和AssetBundle变体等设置在更强大的设备上可能具有不同的内存使用情况。例如:
-
质量级别和图形设置可能会影响用于阴影图的RenderTextures的大小。
-
分辨率缩放可能会影响屏幕缓冲区、RenderTextures和后处理效果的大小。
-
纹理质量设置可能会影响所有纹理的大小。
-
最大LOD可能会影响模型等。
-
如果您有像HD(高清)和SD(标准清晰度)版本的AssetBundle变体,并根据设备规格选择使用哪个版本,您可能还会根据您正在分析的设备获得不同的资产大小。
-
目标设备的屏幕分辨率将影响用于后处理效果的RenderTextures的大小。
-
设备支持的图形API可能会影响着色器的大小,具体取决于API支持哪些变体。
-
拥有一个分层系统,使用不同的质量设置、图形层级设置和Asset Bundle变体,是能够针对更广泛设备的好方法,例如,在4GB移动设备上加载AssetBundle的高清版本,在2GB设备上加载标准清晰度版本。然而,请记住上述内存使用情况的变化,并确保测试两种类型的设备,以及具有不同屏幕分辨率或支持的图形 API 的设备。
注意
:Unity 编辑器通常会显示更大的内存占用,因为从编辑器和分析器加载了额外的对象。它甚至可能显示在构建中不会加载到内存中的资产内存,例如来自资产捆绑(取决于地址可寻址模拟模式)或精灵和图集,或在检查器中显示的资产。在编辑器中,一些引用链可能会更加混乱。