「公众号:游戏开发手记」
1 简介
在 Unity 编辑器中,我们可以通过点击 Stats 按钮来查看 Statistics 面板,这个面板显示了许多关于游戏渲染的信息,如每帧的渲染时间、Tris 和 Verts 的数量、SetPass Calls 的数量等。但在其他运行环境(如发布后的游戏或移动设备上的游戏)中,Unity 默认并不显示该面板
渲染 Statistics 窗口: 「https://docs.unity.cn/cn/2019.4/Manual/RenderingStatistics.html」
如果想在其他运行环境中查看渲染信息,除了使用 Unity Profiler 工具,也可以通过编写代码的方式实现在游戏中收集相关信息
2 ProfilerRecorder
ProfilerRecorder 是 Profiler API 的一部分,允许开发者在运行时收集特定的性能数据
Rendering Profiler 模块 「https://docs.unity3d.com/cn/2021.3/Manual/ProfilerRendering.html」
Memory Profiler 模块 「https://docs.unity3d.com/cn/2021.3/Manual/ProfilerMemory.html」
通过上面的方法及对应的参数,可以很方便的定制需要的性能数据
源码请在公众号回复:调试信息
官方使用示例:
public class RenderStatsScript : MonoBehaviour
{
string statsText;
ProfilerRecorder setPassCallsRecorder;
ProfilerRecorder drawCallsRecorder;
ProfilerRecorder verticesRecorder;
void OnEnable()
{
setPassCallsRecorder = ProfilerRecorder.StartNew(ProfilerCategory.Render, "SetPass Calls Count");
drawCallsRecorder = ProfilerRecorder.StartNew(ProfilerCategory.Render, "Draw Calls Count");
verticesRecorder = ProfilerRecorder.StartNew(ProfilerCategory.Render, "Vertices Count");
}
void OnDisable()
{
setPassCallsRecorder.Dispose();
drawCallsRecorder.Dispose();
verticesRecorder.Dispose();
}
void Update()
{
var sb = new StringBuilder(500);
if (setPassCallsRecorder.Valid)
sb.AppendLine($"SetPass Calls: {setPassCallsRecorder.LastValue}");
if (drawCallsRecorder.Valid)
sb.AppendLine($"Draw Calls: {drawCallsRecorder.LastValue}");
if (verticesRecorder.Valid)
sb.AppendLine($"Vertices: {verticesRecorder.LastValue}");
statsText = sb.ToString();
}
void OnGUI()
{
GUI.TextArea(new Rect(10, 30, 250, 50), statsText);
}
}
3 面板参数
Unity 的 Statistics 面板提供了许多关于游戏性能的重要信息,通过理解和优化这些信息,我们可以提高游戏的流畅性和性能
Statistics 统计面板只统计摄像机视野内所有元素顶点和面片的数量,视野外(摄像机视锥体外)的元素不统计
1 FPS
全称 Frames Per Second,即每秒帧数,表示每秒钟渲染的帧数
2 Batches
在一帧内处理的批次总数,这个数字包括静态和动态批次
3 Draw Calls
即绘制调用,表示在一帧内发出的绘制调用总数
-
Unity 在将游戏对象渲染到屏幕时发出绘制调用。这个数字包括非批量绘制调用以及动态和静态批量绘制调用
-
要在屏幕上绘制游戏对象,引擎必须向图形 API(例如 OpenGL 或 Direct3D)发出绘制调用。绘制调用通常为资源密集型操作,图形 API 为每次绘制调用执行大量工作,从而导致 CPU 端的性能开
-
此开销的主要原因是绘制调用之间的状态变化(例如切换到不同材质),而这种情况会导致图形驱动程序中执行资源密集型验证和转换步骤
4 Tris
Triangles 的缩写,在一帧内处理的三角形数
5 Verts
Vertices 的缩写,在一帧内处理的顶点数
6 Screen
当前游戏窗口的分辨率,以像素为单位
7 SetPass Calls
在一帧中切换用于渲染游戏对象的着色器通道的次数
-
一个着色器(Shader)可能包含多个着色器通道(Pass),每个通道以不同的方式渲染场景中的游戏对象
-
通道是 Shader 对象的基本元素。它包含设置 GPU 状态的指令,以及在 GPU 上运行的着色器程序
-
简单的 Shader 对象可能只包含一个通道,但更复杂的着色器可以包含多个通道。您可以为 Shader 对象不同部分定义单独的通道实现不同的工作方式。例如,需要更改渲染状态、不同的着色器程序或不同的 LightMode 标签的部分
8 Shadow Casters
在一帧中投射阴影的游戏对象的数量。如果一个游戏对象投射多个阴影(因为多个光源照亮它),该对象投射的每个阴影都有一个条目