您现在的位置是:首页 >技术交流 >Unity中GPUInstance详解网站首页技术交流
Unity中GPUInstance详解
为什么要用GPUInstance
在没有GPUInstance此技术之前,对于像草地、树木,割草游戏,它们往往是数据量很大,但同时又只存在微小的差别如位置、旋转、颜色等。如果像常规物体那样进行渲染,所使用的绘制指令必然很多,资源占用必然很大,一是cpu对gpu提交数据的次数(包括设置数据buffer,渲染状态以及调用对渲染原语的绘制即drawcall),二是gpu上的绘制(包括顶点处理和像素绘制),随着场景物体的提升,cpu和gpu的压力都会上升。一个合理的策略就是,我们指定一个需要绘制物体对象,以及多个不同的参数,然后根据参数在一个绘制调用中绘制出来——这就是所谓的GPU实例化。
GPUInstance原理
Gpu Instance就是用来解决这一问题的,对于使用 同一网格 和 同一材质的物体们,它使用少量的渲染调用(DrawCall),渲染同一网格的多个副本,也就是说在渲染时, CPU 可以把 它们的不同的属性(位置,大小,旋转,颜色等) 和 其它Instancing 材质信息组装成一个 Buffer(实际上就是一个数组) 传给 GPU 的一个缓存区。GPU 在渲染这些物体时,会有一个 全局的 SV_InstanceID 即 数组的 下标,每渲染完一个物体就 ++SV_InstanceID,这样我们每个物体就可以根据这个 id 拿到自己的 位置颜色等信息啦。这样我们渲染这些物体时就只需要一个 DrawCall 即将 数组 传给 GPU 缓存区,就可以渲染大量的物体。
官方链接介绍Unity - Manual: GPU instancinghttps://docs.unity3d.com/Manual/GPUInstancing.htmlGPUInstance使用方式
1.unity自动进行
系统会自动对场景中符合规范的,被开启GpuInstance的对象进行Instance合批处理,依靠GameObject,自然沿袭unity的剔除、矩阵运算等,方便调试,但是性能不如后者。最大批处理数量, 实测2019.4,Editor PC,最大数量511。512则会增加批次。
其他测试参考:Unity Instancing batch的最大数量计算与测试_无加冰嘅可乐的博客-CSDN博客
2.手动调用。使用Graphics.DrawMeshInstancedIndirect等API,需要自行计算剔除等运算。
- DrawInstanceMesh:Unity - Scripting API: Graphics.DrawMeshInstanced
- 一次调用Mesh的数量有限,最大为1023个模型
- 材质球必须开启GpuInstance,如果不开启就会出发异常
- 属性赋值使用MaterialBlockProperties的Array方法群..
-
DrawInstanceMeshIndirect:
- 一次调用没有限制副本数量,
- 材质球不需要开启Instance
- 执行效率更高
-
DrawMesh:
- 使用这个API, 只要材质球使用同一个,并且材质球开启了GPUInstance也会被自动Instancing合批的.
GPU Instance合批技术是不支持 SkinnedMeshRender的,不过可以转换为Mesh Render以支持,一下链接可以详细阅读
Unity官方开源的Animation Instacing:Animation Instancing: SkinnedMeshRenderer | Unity Blog
博主:Unity中使用GPU Instancing优化SkinnedMesh渲染_unity调用gpu生成mesh_xoyojank的博客-CSDN博客
Unity中的静态合批,动态合批,SRPBatcher,GpuInstance - 知乎
U3D优化批处理-GPU Instancing了解一下 - 知乎
GitHub - vanCopper/Unity-GPU-Instancing: Unity GPU Instancing