UPL2-4——Rendering 模块

Rendering 模块

Rendering(渲染)模块,用于显示一帧渲染时的数据量(批次数、顶点数等)
在游戏中如果出现以下问题时,可以着重观察这里的内容

  1. 怀疑是因为 DrawCall 过高导致 CPU 性能问题(卡顿、掉帧)
  2. 在中低端手机上发热严重、掉电快
  3. 开启大量实时光照、粒子、动态对象后出现掉帧
  4. 画面复杂卡顿、简单不卡顿时

等等

Rendering 中各参数功能的含义和作用

image

  • 渲染(Rendering) 分析窗口 在这里显示有关CPU和GPU和渲染相关的统计信息

    image

    • Batches Count(批处理数): 该帧内批处理数量(DrawCall 次数),值越高,CPU 压力越大。推荐合批优化
    • SetPass Calls Count(SetPass 调用次数): 该帧内用于渲染游戏对象的着色器渲染通道(Pass)调用次数
      即每帧需要切换 Shader / 材质状态的次数 值越高,GPU 状态切换开销大。尽量减少材质和渲染通道 Pass 的数量
    • Triangles Count(三角形数量):该帧内渲染了多少个三角形(所有网格顶点组成的面)影响 GPU 处理负荷,特别是在移动端需控制数量
    • Vertices Count(顶点数量):该帧内渲染了多少个顶点(所有网格顶点数量) 影响 GPU 顶点处理性能
  • 详细渲染信息

    image

    • Open Frame Debugger:打开帧调试器,关于帧调试器可见:US5L8——帧调试器 Frame Debugger

    • SetPass Calls、Draw Calls、Batches、Triangles、Vertices

      • SetPass Calls:该帧内用于渲染游戏对象的着色器渲染通道(Pass)调用次数,即该帧向 GPU 提交的材质状态切换次数
      • Draw Calls:该帧从 CPU 发起的绘制命令总次数。包含非批处理和动态静态批处理绘制调用
      • Batches:该帧实际合并成的渲染批次数
      • Triangles:该帧内渲染了多少个三角形
      • Vertices:该帧内渲染了多少个顶点
    • (Dynamic Batching)动态批处理、(Static Batching)静态批处理、(Instancing)GPU Instancing(同一网格多个实例共享)具体信息

      • Batched Draw Calls:合并为批处理的DC数
      • Batches:批处理数
      • Triangles:三角形数
      • Vertices:顶点数
      • Time:处理时间
    • Used Textures:该帧使用的 Unity 纹理数量和纹理使用的内存量

    • Render Textures:该帧使用的渲染纹理数量和内存量

    • Render Textures Changes:该帧将一个或多个渲染纹理设置为渲染目标的次数

    • Used Buffers:GPU 缓冲区和内存的总数(包括顶点、索引、计算缓冲区以及渲染所需的所有内部缓冲区)

    • Vertex Buffer Upload In Frame:CPU 在该帧上传到 GPU 的几何体数量(顶点、法线、纹理数据)

    • Index Buffer Upload In Frame:CPU 在该帧上传到 GPU 的三角形索引数据

    • Shadow Casters:该帧中投射阴影的游戏对象数量。如果一个物体受到多个光源影响,那么每个光源产生的阴影都算在内

    使用建议:着重关注

    1. Draw Calls 数量

      它是 CPU 发给 GPU 的绘制命令数量,如果高了,CPU 开销大、容易成为瓶颈
      优化方向:合批(静态、动态合批、GPU Instancing),材质合并等等

    2. SetPass Calls 数量

      它是提交材质或着色器状态的次数,如果高了,GPU 开销大,状态切换频繁,阻碍批处理
      优化方向:减少材质和 Shader 变体 数量,合并材质等

    3. Batches 数量

      它是合批后的实际批次数,理论上越低越好
      可以用来评估合批优化是否生效

    4. Triangles / Vertices 数量

      它是实际渲染的面数和顶点数,特别是移动设备中建议控制在适当范围,比如低端机每帧不超过 50w 三角形,具体看设备

    5. Render Textures

      它是当前帧中创建的渲染纹理数量和内存,如果高了,意味着内存开销大,频繁切换也会影响性能
      我们应该尽量复用 RenderTexture 减少临时对象创建

    等等

Rendering 对于我们的意义

Rendering 可以帮助我们:

  1. 定位 CPU 渲染压力的关键依据
    批处理次数多,意味着 DrawCall 高,意味着 CPU 消耗高
    材质切换次数,意味着 CPU 频繁设置材质,意味着可能带来批处理失败

  2. 判断 GPU 处理压力是否过大

    三角形面数、顶点数都会直接影响 GPU 渲染耗时
    数据量过大往往是因为模型太复杂,粒子特效过多,动态对象过多

  3. 判断画面复杂度对性能的影响

    当进入不同场景、摄像机角度变化、特效显示隐藏
    都可能带来各种数据的变化,这些数据可以让性能下降有据可查

  4. 分析批处理的策略是否生效

    看看使用了静态、动态批处理后,批处理参数是否还是很高、

等等