todo
两者好像不兼容,不能同时开启。
两者都需要在Shader里增加对应的属性块
Unity6 起好像有新方案代替 gpu instance了?
GPU Instancing 与 SRP Batcher 深度解析
1. 核心概念对比
| 特性 | GPU Instancing | SRP Batcher |
| 目标 |
减少Draw Call |
减少CPU开销 |
| 工作原理 |
一次绘制多个相同网格 |
持久化CBuffer,减少SetPass Calls |
| 适用对象 |
相同网格的不同实例 |
相同Shader的不同物体 |
| 数据变化 |
支持Per-Instance数据 |
支持Per-Object数据 |
| Unity版本 |
所有版本支持 |
需要SRP(URP/HDRP) |
性能优化:
Unity 的 GPU Instance(GPU 实例化)会自动进行视锥体剔除,但剔除的逻辑和时机与普通渲染有所不同,核心结论先明确:
GPU Instance 的本质是用一个 DrawCall 渲染多个相同 Mesh 的实例,Unity 对其视锥体剔除的规则是:
- 首先计算该批次所有实例的 合并包围盒(Combined Bounding Box)(由所有实例的本地包围盒 + 各自的位置 / 旋转 / 缩放计算得出);
- 仅当这个 合并包围盒完全在视锥体之外时,才会对整个批次进行视锥体剔除(不执行该 DrawCall);
- 若合并包围盒与视锥体有交集(哪怕只有一个实例在视锥体内),则整个批次都会被提交到 GPU 渲染,不会单独剔除批次中不在视锥体内的单个实例。
简单说:GPU Instance 的视锥体剔除是 “批次级剔除”,而非 “单个实例级剔除”。
因此当相同 GPU Instance 的物体大量零散在场景里时,会造成大量的性能浪费,这时候需要手动进行优化,例如将物体通过八叉树进行空间划分管理,手动进行视锥体裁剪,将当前视锥体内的物体划分到同一个 GPU Instance 里