仅做个人笔记
Memory Profiler 是 Unity 提供的一个内存分析工具,用于帮助开发者监控和优化应用程序的内存使用情况。它能够实时显示内存使用数据,并允许开发者捕获内存快照进行详细分析。
A.在 Unity 的 Memory Profiler 中,简单层级视图(Simple View)提供了一个简洁的概览,显示应用程序在每个帧中的实时内存使用情况。以下是对这些参数的详细解释:
1. Unity
- 含义:本机 Unity 代码中的分配所跟踪的内存量。
- 关注点:这部分内存由 Unity 的本机代码分配,用于引擎的内部操作。
2. Mono
- 含义:托管代码使用的总堆大小和已用堆大小。此内存量是垃圾收集量。
- 关注点:Mono 堆的大小和使用情况,重点关注托管代码的内存分配和垃圾回收。
3. GfxDriver
- 含义:驱动程序对纹理、渲染目标、着色器和网格数据使用的估计内存量。
- 关注点:图形驱动程序的内存使用,通常由纹理、渲染目标、着色器和网格数据占用。
4. FMOD
- 含义:音频驱动程序的估计内存使用量。
- 关注点:音频相关的内存使用,通常较小,但如果音频文件过多或过大,可能会占用较多内存。
5. Profiler
- 含义:用于性能分析器数据的内存。
- 关注点:Profiler 工具自身使用的内存,通常较小。
6. Textures
- 含义:纹理资源的内存使用情况。
- 关注点:纹理是内存消耗的大户,优化纹理的格式和大小可以显著减少内存使用。
7. Meshes
- 含义:网格资源的内存使用情况。
- 关注点:网格模型的点面数,能合并的 mesh 尽量合并。
8. Materials
- 含义:材质资源的内存使用情况。
- 关注点:加载的材质和它们使用的内存的总数。
9. Animations
- 含义:动画资源的内存使用情况。
- 关注点:加载的动画和它们使用的内存的总数。
10. Audio
- 含义:音频资源的内存使用情况。
- 关注点:音频文件的大小和数量,时长较长的音乐文件需要进行压缩成.mp3 或.ogg 格式,时长较短的音效文件可以使用.wav 或.aiff 格式。
11. Object Count
- 含义:创建的对象总数。
- 关注点:如果此数字随着时间的推移而上升,表明游戏创建了一些永不销毁的对象,可能需要检查是否存在内存泄漏。
使用场景
- 查找内存泄漏:通过比较不同时间点的内存快照,识别内存增长的原因。
- 优化内存使用:分析内存快照,找出大内存块和频繁分配的对象,优化这些对象的分配和释放方式。
- 调试内存问题:当应用程序出现崩溃或性能问题时,使用 Memory Profiler 捕获内存快照,分析内存使用情况,找到问题根源并进行修复。
典型参数示例
- Total Committed Memory:2.50/3.43 GB
- 解释:应用程序已分配了 2.50 GB 的内存,而系统为其预留了 3.43 GB 的内存。
- Tracked Memory:1.08/1.23 GB
- 解释:已使用的托管内存为 1.08 GB,预留的托管内存为 1.23 GB。
- Untracked Memory:3.21 GB
- 解释:有 3.21 GB 的内存是 Unity 无法追踪的,可能由本机代码或外部库分配。
B.在 Unity 的 Memory Profiler 中,Detailed 视图提供了应用程序当前状态的详细内存使用情况。以下是 Detailed 视图中各个参数的详细解释:
1. 捕获内存样本
- 功能:点击 Take Sample 按钮可以捕获当前目标的详细内存使用情况。
- 用途:捕获的样本可以帮助你深入了解应用程序的内存分配和使用情况。
2. 收集对象引用
- 功能:启用 Gather Object References 设置可以在捕获样本时收集对象的引用信息。
- 用途:这有助于了解哪些对象在内存中被引用,从而识别内存泄漏。
3. 内存使用分类
- Other:既不是资源、游戏对象也不是组件的对象。这包括 Unity 用于不同系统的内存信息。
- Not Saved:标记为
DontSave
的对象。 - Builtin Resources:Unity 编辑器资源或 Unity 默认资源,例如你添加到图形设置的“始终包含着色器”列表中的着色器。
- Assets:从用户或原生代码引用的资源。
- Scene Memory:对象及其附加组件。
4. 对象引用信息
- 功能:在捕获样本时,Profiler 会收集对象的引用信息,并在窗口的右侧窗格中显示。
- 用途:通过查看对象的引用链,可以找到并修复导致内存泄漏的代码逻辑。
使用场景
- 查找内存泄漏:通过捕获内存快照并分析对象引用关系,识别不再需要但仍然被引用的对象。
- 优化内存使用:通过分析内存分配和使用情况,优化大内存块和频繁分配的对象。
- 调试内存问题:当应用程序出现崩溃或性能问题时,使用 Memory Profiler 捕获内存快照,分析内存使用情况,找到问题根源并进行修复。
示例
假设你在 Detailed 视图中捕获了一个内存样本:
- Other:可能包括一些系统内存分配,如插件或驱动程序的内存使用。
- Not Saved:标记为
DontSave
的对象,这些对象不会被保存到磁盘。 - Builtin Resources:Unity 内置资源,如默认着色器。
- Assets:加载的纹理、网格、材质等资源。
- Scene Memory:当前场景中的游戏对象及其组件。
通过这些参数,你可以全面了解应用程序的内存使用情况,并针对性地进行优化。例如,如果发现 Assets 类别中的内存使用过高,可以优化纹理和网格的大小和格式;如果 Other 类别中的内存使用过高,可能需要检查本机插件或外部库的内存分配。