静态批处理是一种绘制调用批处理方法,它组合不移动的网格以减少绘制调用。它将组合的网格转换为世界空间,并为它们构建一个共享顶点和索引缓冲区。然后,对于可见网格,Unity 会执行一系列简单的绘制调用,每个调用之间几乎没有状态变化。静态批处理不会减少绘制调用的数量,而是减少它们之间的渲染状态更改的数量。静态批处理比动态批处理更高效,因为静态批处理不会转换 CPU 上的顶点。
兼容性:
功能 | 内置渲染管线 | 通用渲染管线 (URP) | 高清渲染管线 (HDRP) | 自定义可编程渲染管线 (SRP) |
---|---|---|---|---|
静态批处理 | 是 | 是 | 是 | 是 |
开启批处理:
1.构建时:
在Edit > Project Settings > Player > Other Settings (其他设置) 中,勾选 Static Batching 。
将需要合批的物体在物体的 Inspector 面板中勾选Static,并选择Batching Static
注意:如果在构建时执行静态批处理,则 Unity 在运行时不会使用任何 CPU 资源来生成静态批处理的网格数据。
2.运行时:
运行时使用StaticBatchingUtility 类批处理静态网格,静态 StaticBatchingUtility.Combine 方法将传入的游戏对象组合在一起,并为静态批处理做好准备。对于运行时以程序方式生成的网格有用。
与构建时的静态批处理不同,运行时的批处理不需要启用 Static Batching Player Setting。
合批条件:
合批时机:
1.构建时:
2.运行时:
性能影响:
使用静态批处理需要额外的 CPU 内存来存储组合的几何体。如果多个游戏对象使用相同的网格,则 Unity 会为每个游戏对象创建一个网格副本,并将每个副本插入到组合网格中。这意味着相同的几何体在组合网格中多次出现。无论您使用的是编辑器还是运行时API来准备用于静态批处理的游戏对象,Unity 都会执行此作。如果要保持较小的内存占用,可能必须牺牲渲染性能并避免对某些游戏对象进行静态批处理。例如,在茂密的森林环境中将树木标记为静态可能会对内存产生严重影响。
注:
1.静态批处理可以包含的顶点数存在限制。每个静态批处理最多可以包含 64000 个顶点。如果有更多,Unity 会创建另一个批次。
2.一旦游戏对象被标记为静态并进行了静态批处理,在运行时就不能再改变其位置、旋转、缩放等属性,否则会导致渲染错误。
3.静态批处理会影响光照计算,因为合批后的对象会被视为一个整体。在使用静态批处理时,需要注意光照烘焙的设置,以确保光照效果符合预期。
4.静态批处理可以显著减少 Draw Call 数量,提高渲染性能,特别是在场景中包含大量静态对象的情况下。但对于经常移动或变化的对象,不适合使用静态批处理。
未完待续。。。
参考链接:
静态批处理 - Unity 手册
Unity - Manual: Static batching (unity3d.com)