【Unity性能优化——Stats面板】
一、Stats 面板是什么?如何打开?
Unity Editor 的 Stats 面板是一个实时显示当前游戏视图(Game View)性能数据的强大工具。它提供了关于渲染、音频等关键指标的概览,帮助我们快速定位性能问题的方向。
打开方式:
在 Game 视图窗口中,点击左上角的 Stats 按钮即可打开/关闭面板。
二、Stats 面板各模块详细解读
Stats 面板通常分为以下几个主要部分:
1. Audio(音频)
- Level: 当前播放的所有音频音量的峰值(显示为百分比)。如果一直很高,说明音频可能一直在播放或音量过大。
- Clipping: 音频裁剪的量。如果数值很高(变红),说明音频系统过载,无法处理所有音频源,导致音质受损。优化方法是减少同时播放的音频数量、使用音频压缩或调整优先级。
- Stream CPU Usage: 音频流解码所占用的CPU百分比。通常较低,但如果使用大量未压缩的WAV文件可能会升高。
2. Graphics(图形/渲染 - 这是最核心的部分)
这部分信息量最大,是图形性能分析的重中之重。
-
FPS (Frames Per Second): 每秒帧数。最直观的性能指标。
- 当前值/平均值:例如
60.0FPS (16.6ms)
。括号内是渲染一帧所需的毫秒数。1000ms / FPS = 每帧耗时(ms)
。 - 目标: 通常维持在 30FPS (33.3ms) 或 60FPS (16.6ms) 以上为宜。VR项目通常需要 72FPS 或 90FPS。
- 当前值/平均值:例如
-
CPU: 主要指的是主线程的耗时。
- Render Thread: 负责向GPU提交渲染命令的专用线程的耗时。
- 关系: 如果 CPU > Render,瓶颈通常在主线程(游戏逻辑、动画、物理等)。如果 Render > CPU,瓶颈通常在GPU(填充率、复杂Shader、Overdraw等)。
-
Batches: 合批数量。
- Saved by batching: 通过合批节省的Draw Call数量。这个数值越高,说明合批优化效果越好。
- 目标: 尽可能降低 Batches 总数。通过静态合批(Static Batching)、动态合批(Dynamic Batching) 和 GPU Instancing 来优化。
-
Tris 和 Verts: 当前帧渲染的三角形总数和顶点总数。这是一个重要的参考指标,数量过高会严重影响GPU性能,尤其是在移动设备上。需要持续监控并进行模型面数优化。
-
Screen: 当前游戏视图的分辨率、以及抗锯齿(AA) 等级。
-
SetPass calls: 设置渲染通道的次数。这是比 Batches 更准确的Draw Call衡量指标。每次SetPass Call都可能意味着一次状态切换(如切换Shader、纹理),代价高昂。目标同样是尽可能降低此数值。
-
Shadow casters: 当前帧中有多少物体在投射阴影。阴影计算开销很大,需要控制数量和质量。
-
Visible Skinned Meshes: 可见的蒙皮网格数量。常用于角色动画,CPU开销较大。
-
Animations: 正在播放的动画数量。
三、如何利用Stats面板进行性能优化?—— 实战流程
-
建立基线:
- 在目标平台(如PC、手机)上运行游戏,记录一个典型场景的FPS、Batches、Tris等关键数据。这是你的“性能基线”。
-
识别瓶颈:
- FPS 低? 看 CPU 和 Render 时间。
- 如果 CPU时间 > Render时间:瓶颈在CPU。检查:
- Batches/SetPass calls 是否过高? -> 优化合批。
- 动画、物理、脚本逻辑 是否复杂? -> 使用Profiler深入分析代码耗时。
- Visible Skinned Meshes 是否过多? -> 减少同屏动画角色。
- 如果 Render时间 > CPU时间:瓶颈在GPU。检查:
- Tris/Verts 是否过高? -> 简化模型,使用LOD。
- 分辨率和抗锯齿是否开得太高? -> 降低设置。
- 是否存在大量Overdraw(过度绘制)? -> 使用Frame Debugger检查,优化Shader和绘制顺序。
- 是否使用了非常复杂的Shader? -> 简化Shader或使用更高效的Shader。
- 如果 CPU时间 > Render时间:瓶颈在CPU。检查:
- FPS 低? 看 CPU 和 Render 时间。
-
实施优化:
- 根据上一步的推断,进行针对性修改。例如:
- CPU瓶颈:给静态物体标记
Static
,使用GPU Instancing,合并材质球。 - GPU瓶颈:启用相机 occlusion culling,添加LOD Group,压缩纹理。
- CPU瓶颈:给静态物体标记
- 根据上一步的推断,进行针对性修改。例如:
-
验证结果:
- 再次运行游戏,对比Stats面板中的数据变化。FPS是否提升?Batches是否减少?Tris是否降低?
-
循环迭代:
- 性能优化是一个持续的过程。不断重复 分析->优化->验证 的循环,直到达到目标性能指标。
四、提醒
- Stats面板是“指南针”,不是“地图”:它能告诉你性能问题的方向(是CPU还是GPU问题),但要找到具体的罪魁祸首(是哪个脚本、哪个预制体、哪个Shader),必须结合 Profiler 窗口和 Frame Debugger 窗口。
- 在目标平台上测试:在Editor中运行的数据(尤其是内存)与真机差异很大,最终的性能测试一定要在真机上进行。
- 不同版本UI可能不同:Unity不同版本可能会调整Stats面板的布局和显示内容,但核心指标(FPS, Batches, Tris, SetPass)是永恒的。