Unity | 运行时显示调试信息

「公众号:游戏开发手记」

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」

通过上面的方法及对应的参数,可以很方便的定制需要的性能数据

Unity | 运行时显示调试信息_第1张图片

源码请在公众号回复:调试信息

官方使用示例:

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

在一帧中投射阴影的游戏对象的数量。如果一个游戏对象投射多个阴影(因为多个光源照亮它),该对象投射的每个阴影都有一个条目

你可能感兴趣的:(unity,游戏引擎)