Unity3D :静态批处理
推荐:将NSDT场景编辑器加入你的3D工具链
3D工具集:NSDT简石数字孪生
静态批处理
静态批处理是一种绘制调用批处理方法,它组合不移动的网格以减少绘制调用。它将组合的网格转换为世界空间,并为其构建一个共享顶点和索引缓冲区。然后,对于可见网格,Unity 会执行一系列简单的绘制调用,每个调用之间几乎没有状态更改。静态批处理不会减少绘制调用的数量,而是减少它们之间的呈现状态更改的数量。
静态批处理比动态批处理更有效,因为静态批处理不会转换 CPU 上的顶点。有关静态批处理的性能影响的详细信息,请参阅性能影响。
要求和兼容性
本节包含有关静态批处理的渲染管线兼容性的信息。
渲染管线兼容性
功能 | 内置渲染管线 | 通用渲染管线 (URP) | 高清渲染管线 (HDRP) | 自定义可编程渲染管线 (SRP) |
---|---|---|---|---|
静态批处理 | 是 | 是 | 是 | 是 |
使用静态批处理
Unity 可以在构建时和运行时执行静态批处理。作为一般规则,如果在构建应用程序之前场景中存在游戏对象,请使用编辑器在构建时对游戏对象进行批处理。如果在运行时创建游戏对象及其网格,请使用运行时 API。
使用运行时 API 时,可以更改静态批处理根的转换属性。这意味着您可以移动、旋转或缩放构成静态批次的整个网格组合。您无法更改单个网格的变换属性。
要对一组游戏对象使用静态批处理,游戏对象必须符合静态批处理的条件。除了常见用法信息中描述的条件外,请确保:
- 游戏对象处于活动状态。
- 游戏对象具有网格过滤器组件,并且该组件已启用。
- 网格过滤器组件具有对网格的引用。
- 网格已启用读/写。
- 网格的顶点计数大于 0。
- 网格尚未与另一个网格合并。
- 游戏对象具有网格渲染器组件,并且该组件已启用。
- 网格渲染器组件不使用具有标记设置为 true 的着色器的任何材质。
DisableBatching
- 要批处理在一起的网格使用相同的顶点属性。例如,Unity 可以批量使用顶点位置、顶点法线和一个 UV 的网格,但不能批处理使用顶点位置、顶点法线、UV0、UV1 和顶点切线的网格。
有关静态批处理的性能影响的信息,请参阅性能影响。
构建时的静态批处理
您可以在编辑器中在构建时启用静态批处理。
在构建时执行静态批处理:
- 转到编辑>项目设置>播放器。
- 在其他设置中,启用静态批处理。
- 在场景视图或层次结构中,选择要批处理的游戏对象,然后在检查器中查看它。
提示: 您可以同时选择多个游戏对象,为所有游戏对象启用静态批处理。 - 在游戏对象的静态编辑器标志中,启用静态批处理。
如果指定的静态网格体满足常见用法信息中所述的条件,Unity 会自动将其批处理到同一绘制调用中。

注意:如果在构建时执行静态批处理,Unity 不会在运行时使用任何 CPU 资源来生成静态批处理的网格数据。
运行时的静态批处理
为了在运行时批处理静态网格体,Unity 提供了 StaticBatchingUtility 类。静态 StaticBatchingUtility.Combine 方法组合您传入的游戏对象,并为静态批处理准备它们。这对于在运行时以程序方式生成的网格特别有用。
与生成时的静态批处理不同,运行时的批处理不需要启用静态批处理播放器设置。有关如何使用此 API 的信息,请参阅 StaticBatchingUtility。
性能影响
使用静态批处理需要额外的 CPU 内存来存储组合的几何图形。如果多个游戏对象使用相同的网格,Unity 将为每个游戏对象创建网格的副本,并将每个副本插入到组合网格中。这意味着相同的几何图形会多次出现在组合网格中。无论您使用编辑器还是运行时 API 为静态批处理准备游戏对象,Unity 都会执行此操作。如果要保持较小的内存占用量,则可能必须牺牲渲染性能并避免对某些游戏对象进行静态批处理。例如,在茂密的森林环境中将树木标记为静态可能会产生严重的记忆影响。
注: 静态批处理可以包含的顶点数有限制。每个静态批处理最多可以包含 64000 个顶点。如果有更多批处理,Unity 将创建另一个批处理。
由3D建模学习工作室整理翻译,转载请注明出处!