DrawCall是一个从CPU发送到GPU中用于绘制对象的请求。
着色器(Shader):是一种用于定义GPU应该如何渲染输入的顶点和纹理数据的简短程序。
材质(Material):用于定义渲染对象外观的一种属性,是着色器的容器。
Frame Debugger
帧调试器 (Frame Debugger) 可将正在运行的游戏的状态冻结到特定帧来自由回放,并查看用于渲染该帧的各个绘制调用(draw calls)。除了列出绘制调用,调试器还可逐个单步执行这些调用,以便您详细查看场景是如何从场景的图形元素构建的。
Frame Debugger 窗口(菜单:Window > Analysis > Frame Debugger)会显示绘制调用信息,并允许您控制正在构建的帧的“回放”。
主列表以层级视图形式显示绘制调用(以及其他事件,例如帧缓冲区清除)的序列,并在其中标识绘制调用的来源。列表右侧面板提供有关绘制调用的更多信息,例如几何体细节和用于渲染的着色器。
官方文档:The Frame Debugger window - Unity 手册
动态批处理
动态批处理有以下3个重要优势:
- 在运行时生成
- 包含的对象在不同的帧之间可能有所不同,这取决于哪些网格在主摄影机视图中当前是可见的
- 能在场景中运动的对象也可以批处理。
成功动态合批的需求
Dynamic batching - Unity 手册 (unity3d.com)
在以下情况下,Unity 要么根本无法使用动态批处理,要么只能在有限的范围内应用动态批处理:
- Unity 无法将动态批处理应用于包含超过 900 个顶点属性和 225 个顶点的网格。这是因为网格的动态批处理具有每个顶点的开销。例如,如果您的着色器使用顶点位置、顶点法线和单个 UV,则 Unity 最多可以批处理 225 个顶点。但是,如果您的着色器使用顶点位置、顶点法线、UV0、UV1 和顶点切线,则 Unity 只能批处理 180 个顶点。
- 如果游戏对象使用不同的材质实例,Unity 无法将它们批处理在一起,即使它们本质上是相同的。唯一的例外是阴影投射器渲染。
- 具有光照贴图的游戏对象具有其他渲染器参数。这意味着,如果要批量光照贴图游戏对象,它们必须指向相同的光照贴图位置。
- Unity 无法将动态批处理完全应用于使用多通道着色器的游戏对象。
- 几乎所有 Unity 着色器都支持前向渲染中的多个光源。为了实现这一点,他们为每个光源处理一个额外的渲染通道。Unity 仅对第一个渲染通道进行批处理。它无法批量绘制附加的每像素光源的绘制调用。
- 旧版延迟渲染路径不支持动态批处理,因为它在两个渲染通道中绘制游戏对象。第一遍是轻量级预传递,第二遍渲染游戏对象。
静态批处理
静态批处理是一种绘制调用批处理方法,它组合不移动的网格以减少绘制调用。它将组合的网格转换为世界空间,并为其构建一个共享顶点和索引缓冲区。然后,对于可见网格,Unity 会执行一系列简单的绘制调用,每个调用之间几乎没有状态更改。静态批处理不会减少绘制调用的数量,而是减少它们之间的渲染状态更改的数量。
使用静态批处理的条件
- 游戏对象处于活动状态。
- 游戏对象具有Mesh Filter组件,并且该组件已启用。
- Mesh Filter组件上具有对Mesh的引用。
- 引用的Mesh已启用读/写。
- Mesh的顶点计数大于 0。
- Mesh尚未与另一个网格合并。
- Mesh Renderer组件不使用任何具有shader标签设置为true.DisableBatching的材质。
- 要批处理在一起的网格使用相同的顶点属性。(例如,Unity 可以批量使用顶点位置、顶点法线和一个 UV 的网格,但不能批处理使用顶点位置、顶点法线、UV0、UV1 和顶点切线的网格。)
运行时的静态批处理
为了在运行时批处理静态网格体,Unity 提供了 StaticBatchingUtility 类。静态 StaticBatchingUtility.Combine 方法组合您传入的游戏对象,并为静态批处理准备它们。这对于在运行时以程序方式生成的网格特别有用。
与生成时的静态批处理不同,运行时的批处理不需要启用静态批处理播放器设置。