unity静态批处理
- 静态批处理
- 要求和兼容性
- 渲染管线兼容性
- 使用静态批处理
- 在构建时进行静态批处理
- 在构建时执行静态批处理的步骤:
- 在运行时进行静态批处理
- 性能影响
静态批处理
静态批处理是一种绘制调用批处理方法,它将不移动的网格组合在一起,以减少绘制调用。它将组合后的网格转换为世界空间,并为它们构建一个共享的顶点和索引缓冲区。然后,对于可见的网格,Unity 执行一系列简单的绘制调用,几乎没有状态变化。静态批处理不会减少绘制调用的数量,而是减少它们之间的渲染状态变化。
静态批处理比动态批处理更高效,因为静态批处理不会在 CPU 上变换顶点。有关静态批处理的性能影响的更多信息,请参阅性能影响。
要求和兼容性
该部分包含有关静态批处理的渲染管线兼容性的信息。
渲染管线兼容性
功能 | 内置渲染管线 | 通用渲染管线 (URP) | 高清渲染管线 (HDRP) | 自定义可编程渲染管线 (SRP) |
---|---|---|---|---|
静态批处理 | 是 | 是 | 是 | 是 |
使用静态批处理
Unity 可以在构建时和运行时执行静态批处理。一般来说,如果 GameObjects 在构建应用程序之前就存在于场景中,建议使用编辑器在构建时批处理。如果在运行时创建 GameObjects 及其网格,则使用运行时 API。
当使用运行时 API 时,可以更改静态批次根对象的变换属性。这意味着你可以移动、旋转或缩放组成静态批次的整个网格组合,但不能更改单个网格的变换属性。
要使用静态批处理,GameObjects 必须符合静态批处理的条件。除了常见使用信息中描述的标准外,还需要确保:
- GameObject 是活动的。
- GameObject 具有启用的 Mesh Filter 组件。
- Mesh Filter 组件引用一个 Mesh。
- Mesh 启用了读/写。
- Mesh 的顶点数大于 0。
- Mesh 没有与其他 Mesh 组合过。
- GameObject 具有启用的 Mesh Renderer 组件。
- Mesh Renderer 组件未使用具有
DisableBatching
标签设置为 true 的材质。
有关静态批处理性能影响的信息,请参阅性能影响部分。
在构建时进行静态批处理
你可以在编辑器中启用构建时的静态批处理。
在构建时执行静态批处理的步骤:
- 转到 Edit > Project Settings > Player。
- 在 Other Settings 中启用 Static Batching。
- 在场景视图或层级中选择要批处理的 GameObject,并在检视器中查看。
- 提示:可以同时选择多个 GameObject,以便为它们全部启用静态批处理。
- 在 GameObject 的 Static Editor Flags 中启用 Batching Static。
如果满足常见使用信息中描述的条件,Unity 将自动将指定的静态网格批处理为同一个绘制调用。
注意:如果在构建时执行静态批处理,Unity 在运行时不会使用任何 CPU 资源来生成静态批次的网格数据。
在运行时进行静态批处理
要在运行时批处理静态网格,Unity 提供了 StaticBatchingUtility
类。静态方法 StaticBatchingUtility.Combine
将传入的 GameObjects 组合并为静态批处理做准备。这对于在运行时程序生成的网格特别有用。
与构建时的静态批处理不同,运行时批处理不需要启用静态批处理玩家设置。有关如何使用此 API 的信息,请参阅 StaticBatchingUtility
。
性能影响
使用静态批处理需要额外的 CPU 内存来存储组合的几何体。如果多个 GameObject 使用相同的网格,Unity 会为每个 GameObject 创建该网格的副本,并将每个副本插入到组合网格中。这意味着相同的几何体在组合网格中会多次出现。无论你使用编辑器还是运行时 API 准备 GameObjects 进行静态批处理,Unity 都会这样做。如果你希望保持较小的内存占用,可能需要牺牲渲染性能,并避免对某些 GameObjects 使用静态批处理。例如,在密集森林环境中将树木标记为静态可能会对内存产生严重影响。
注意:静态批处理对顶点数量有上限。每个静态批次最多可以包含 64000 个顶点。如果超过此数量,Unity 会创建另一个批次。