合批类型:StaticBatch 静态合批 DynamicBatch 动态合批 InstancingBatch SRP Batch
DrawCall就是对完整描画的上下文的state的设置及其对Draw指令的调用
Unity渲染管线分为两个大的阶段:ShadowMapJob渲染阴影 RenderLoopJob正常描画
静态合批工作流:
1.勾选static选项,在BuildTarget时预先对Mesh进行Combine 对网格进行合并,合并成一个大的网格 MakeBatch
2.描画时向GPU提交Combine Mesh
AwakeFromLoadThreaded
AsyncVertexDataReadCompleteCallBack-ProcessRawVertexJob
AsyncVertexDataProcessingCompleteCallBack
3.Mesh数据一旦上传到GPU后,立即释放:ReleaseUploadInstruction
排序因素的顺序 Render Data的排序
-- Global Sort Layers
-- Render queue index 材质上面的渲染队列
-- Renderer priority 代码设置
-- Distance 从后向前排序
-- Sort Order 每个render都有这个属性
-- Material index 分配的ID,用途这俩个材质是不是同一个材质
-- 静态合批对象 :1.Material Sortkey 2.Geometry key submesh的数量值,按0-n顺序画 先判断是不是同一个材质,同一个材质合并在一起,再判断是不是同一个mesh,同一个mesh 排序
-- LightMap 根据lightMap的index大小进行排序
合批过程:
1.从queue中先获取第一个node
2.和队列中剩余的node依次进行比较处理
3.知道找到第一个不能和进行合批的node
4.提交Mesh数据给GPU,进行一次合批描画
5.更新循环index为找到的该node点
6.以此新的index作为起点开始下一次循环迭代的查找
Shadow Batch Failed :StartOfShadowCascade 不同的阴影设置 投射物体使用的shader或属性或变体不同 OddNegativeScaling 和非OddNegativeScaling 不会合批
ForwardRenderLoopJob:(不合批原因)
1.被不同光照探针影响不合批,光照探针在烘焙的时候会烘焙球谐系数到光照探针设置数据里,不同光照探针势必会造成数据不同所以不合批
2.多个光源,Base光源和Add光源
3.不同材质或者同一材质不同属性
4.MutilPassShader 未合批,shader有多个pass
5.OddNegativeScaling
6.DifferentShadowReceiving 不同的阴影设置选项
7.Lightmapped
indices count 32K 一个批次 如果超过这个数量则拆到下一个批次
vertex count 65535 数量不能超过
如果对象大于4000个但是每个都很小,满足indices count<32 并且vertex count<65535 但是引擎内部会分两个批次
动态合批限制: render不要太小,太小太多引擎会打断合批
vertex number :300 针对submesh而言
vertex arrbutes number:900 针对submesh而言
renderer number: 88 最大88个Render
动态合批的时候还需要判定的是送动态合批处理顶点的数据是否兼容引擎内部动态合批处理的程序:
--通道信息的数据格式是否一致,并且数据连续: Vertex,Normal,Tangent
-- Foat32 & (3,3,4)
-- Colors,texture coords 数据大小必须能被4整除
-- 位于Stream0
-- 数据必须是连续的
Deferred Batch Failed:不同的反射探针不能合批
Instancing Batcher:集合信息不同