关于优化draw call的手段
对比
GPU Instancing
SRP Batcher
Dynamic Batching
Static Batching
原理
在不同的位置使用不同的参数对一个网格进行多次的渲染。对于使用同一个网格和材质的物体,在渲染时cpu会把位置信息和其他instancing的材质信息组装成一个buffer传递给gpu的一个缓存区。gpu在缓存时,根据数组下表找到实例id获取信息
减少发出drawcall前的设置工作,减少cpu的开销成本。(见下面流程图)
在进行场景绘制之前将所有共享同一材质的模型顶点信息变换到世界空间,然后通过一次drawcall绘制多个模型。
unity打包会提取静态模型的Vertex Buffer和index Buffer,根据其在场景中的信息,将顶点数据转变到世界空间下,存储在一个更大的vb和ib中。记录起始位置和最终位置。减少dc,但是节省了计算资源,同时因共享材质不会有渲染状态切换。
使用条件
相同材质球、相同mesh
自定义渲染管线(SRP、HDRP、URP)
1.mesh不能超过900个顶点属性且不超过300个顶点2.如果shader使用了顶点位置,法线,uv0,uv1和切线,最多不能超过180个顶点 3.相同材质 4.改成renderer.material会造成mat的拷贝,中断批处理5.多pass shader会中断
标记了Static,同时使用了相同的材质
优点
没有对网格的限制,不需要占用过多内存。
可以使用不同材质,但是必须具有相同的着色器
一次drawcall绘制
节省了计算资源,同时因共享材质不会有渲染状态切换。(因为Command Buffer会缓存绘制指令)
缺点
围绕一个网格和相同的材质实例工作,不能进行网格的合并
必须使用尽可能少的着色器变体
顶点变换是在cpu完成的,会给cpu带来一定开销。不适合顶点数量过多的模型
会增加包体,运行时内存增加。
SRP Build和Draw命令的批处理对比:
SRP 工作流程: