1. CPU
- 渲染图形
- 脚本执行
- 物理
- 动画
- 垃圾回收
- 光照
- UI
- 垂直同步VSync
- 其他
2. Memory
- Scene Memory,场景对象组件。
- Assets 资源
- Builtin Resources 内置资源
- Not Saved 标记为DontSave的对象(该对象不保存到场景。加载新场景时,也不会销毁它。它是 HideFlags.DontSaveInBuild | HideFlags.DontSaveInEditor | HideFlags.DontUnloadUnusedAsset 的快捷方式)
- 其他
3. Rendering
- Draw Calls Count, Unity 在一帧内发出的绘制调用总数。Unity 在将游戏对象渲染到屏幕时发出绘制调用。这个数字包括非批量绘制调用以及动态和静态批量绘制调用。
- SetPass Calls Count, Unity 在一帧中切换用于渲染游戏对象的着色器通道的次数。一个着色器可能包含多个着色器通道,每个通道以不同的方式渲染场景中的游戏对象。
- Total Batches Count。 Unity 在一帧内处理的批次总数。这个数字包括静态和动态批次。
- Triangles Count。Unity 在一帧内处理的三角形数。
- Vertices Count Unity 在帧期间处理的顶点数。
- Dynamic Batching、Static Batching、Instancing
- Used Textures Count。 Unity 在帧期间使用的纹理数
- Used Textures Bytes。 纹理使用的内存量。
- Render Textures Count。 Unity 在帧期间使用的 RenderTextures 数
- Render Textures Changes Count。 Unity 在帧期间将一个或多个 RenderTextures 设置为渲染目标的次数。
- Used Buffers Count。 所使用的 GPU 缓冲区和内存的总数。这包括顶点、索引和计算缓冲区以及渲染所需的所有内部缓冲区。
- Used Buffers Bytes。 RenderTextures 使用的内存量。
- Vertex Buffer Upload In Frame Count。 CPU 在帧中上传到 GPU 的几何体数量。这代表顶点/法线/ texcoord 数据。GPU 上可能已经有一些几何体。此统计信息仅包括 Unity 在帧中传输的几何体。
- Index Buffer Upload In Frame Count。 PU 在帧中上传到 GPU 的几何体数量。这表示三角形索引数据。GPU 上可能已经有一些几何体。此统计信息仅包括 Unity 在帧中传输的几何体。
- Index Buffer Upload In Frame Bytes。
- Shadow Casters Count。 在一帧中投射阴影的游戏对象的数量。如果一个游戏对象投射多个阴影(因为多个光源照亮它),该对象投射的每个阴影都有一个条目。
4. UI
- Layout。 布局消耗, 布局组件重点。
- Render。 UI 在完成渲染部分中花费的时间。
- Batches。 显示一起批处理的绘制调用的总数。
- Rebuild。 顶点重建。
- Vertices。用于渲染 UI 某个部分的顶点总数。
常见原因: 1. 不与画布共面 (Not Coplanar With Canvas):批处理需要对象的矩形变换与画布共面(未旋转)。 2. 画布注入索引 (CanvasInjectionIndex):CanvasGroup 组件存在并强制新建批次,例如在其余部分上显示一个组合框的下拉列表时。 3. 不同的材质实例、矩形裁剪、纹理、A8 纹理用法 (Different Material Instance, Rect clipping, Texture, or A8TextureUsage):Unity 只能将具有相同材质、遮罩、纹理和纹理 Alpha 通道用法的对象一起进行处理。
5. Global Illumination
- Total CPU。消耗的时间。
6. 物理
- Physics.Processing 或 Physics.Simulate。 消耗时间、调用次数
- 物理组件统计。
7. 可用代码
- CustomSampler. 使用 CustomSampler 测量脚本代码块的执行时间。生成的信息将显示在 CPU 性能分析器中,并且可以通过 Recorder 捕获。 使用 CustomSampler 来分析代码比使用 Profiler.BeginSample 更高效。这是因为与 Profiler.BeginSample 相比,预先创建的 CustomSamplers 具有非常低的 Begin 调用开销。
- Profiler
- Recorder
- Sampler
// debug 模式
EditorUserBuildSettings.development = true;
//下面为 Unity Profiler 调试选项
EditorUserBuildSettings.connectProfiler = true;
EditorUserBuildSettings.buildWithDeepProfilingSupport = true;
// deep 模式支持
EditorUserBuildSettings.buildWithDeepProfilingSupport = true;using UnityEngine;
using UnityEngine.Profiling;
public class ProfilerAPITest : MonoBehaviour
{
CustomSampler sampler;
Recorder behaviourUpdateRecorder;
void Start()
{
sampler = CustomSampler.Create("ProfilerAPITest");
behaviourUpdateRecorder = Recorder.Get("BehaviourUpdate");
behaviourUpdateRecorder.enabled = true;
}
void Update()
{
sampler.Begin();
{
GameObject[] gos = new GameObject[10];
for (int i = 0; i < gos.Length; i++)
{
gos[i] = GameObject.CreatePrimitive(PrimitiveType.Cube);
}
for (int i = 0; i < gos.Length; i++)
{
GameObject.Destroy(gos[i]);
}
}
sampler.End();
if (behaviourUpdateRecorder.isValid)
{
Debug.Log($"BehaviourUpdate time { behaviourUpdateRecorder.elapsedNanoseconds}");
}
}
}https://docs.unity3d.com/cn/2022.1/Manual/ProfilerWindow.html