参考文章:
图形渲染及优化—Unity合批技术实践
图形渲染及优化—Batch
批是啥?
对某对象进行批量处理叫批处理
Batch是啥?
引擎每帧提交的Batch数量就是衡量渲染压力的指标
Batch就是调用一次API的绘制接口向GPU提交相同渲染状态的一定数量的三角形的行为
接口:OpenGL的glDrawArrays/glDrawElements
Batch等于一堆打包后的Draw call
什么叫合批:
以中性能优化的方式
将多次绘制请求,在允许的条件下进行合并处理,减少CPU对GPU绘制请求的次数
怎么开启?
1.静态合批(static batch)
将static的静态物体(永远不会移动、旋转和缩放) ,如果相同材质球,面数在xx之内。unity会自动合并成一个batch送往GPU处理
(64k顶点和64k索引)
使用静态合批需要额外的内存开销来存储合并后的几何数据。
如果一些物体共用了同样的几何数据,那么引擎会在编译以及运行状态对每个物体创建一个几何数据备份
如果static物体过大,应该注意内存开销
原理:
1.自动提取这些静态模型的 VertexBuffer和IndexBuffer
2.根据其在场景中的位置等最终状态信息,将这些模型的顶点数据变换到世界空间下
3.重新构建大的VertexBuffer和IndexBuffer
4.记录每一个子模型的IndexBuffer数据在构建大的IndexBuffer的起始以及结束位置
2.动态合批(dynmaic batch)
如果动态物体共用着相同的材质,那么Unity会自动对这些物体进行处理(动态批处理是自动完成的)
注意:
1.动态批处理物体需要在每个顶点上进行一定开销,动态批处理仅支持小于900顶点的网格物体(不知道现在啥样了)
2.如果着色器使用顶点位置,法线和UV值三种属性,只能批处理300顶点以下的物体;如果着色器需要使用顶点位置,法线,UV0,UV1和切向量,只能批处理180顶点以下的物体
3.不能使用缩放尺度(scale),缩放不同的物体不能进行批处理;统一缩放尺度的物体不会与非统一缩放尺度的物体进行批处理,eg:(1,1,1)和(1,2,1)不会批处理,(1,2,1)和(1,3,1)可以进行批处理
4.使用不同材质的实例化物体将会导致批处理失败
主要区别:
1.静态的不会再改了,动态的改了也能和
2.动态的比较费,只能和小的
3.本质上静态合批是用内存给GPU降低压力,动态合批是拿CPU给GPU降低压力
网友评论