场景优化
对于unity项目场景优化的一点点经验,可能有理解错误,希望能指出
-
主要优化的方向Drawcall,渲染面数(模型/阴影),Setpass Call,CPU占用率,灯光烘培,贴图纹理优化,内存
-
Drawcall 可以采用的手段有静态批处理,动态批处理,GPUInstancing,SRP Batcher
- 静态批处理:
勾选BatchingStatic,打包后会将相同模型的物体进行合并网格,达到批处理的效果,但是会增加包体大小,优点可以进行烘培光照贴图 - 动态批处理:
每一帧把可以进行批处理的模型网格进行合并,再把合并后模型数据传递给GPU,然后使用同一个材质对其渲染,顶点属性要小于900,缺点动态批处理会消耗CPU,限制比较大.SRP渲染管线的动态批处理设置在渲染管线中的Advanced->Dynamic Batching选项 - GPUInstancing:
通过Graphics.DrawMeshInstanced方法将将相同模型,相同材质球的物体,不同位置旋转大小信息,进行同一批次渲染,该方法需在Update中每帧调用
优点:可以对动态生成的物体进行合批,可以通过代码控制渲染,通过AnimationInstancing脚本,将蒙皮动画烘培成贴图数据,通过读取贴图数据,在材质球中修改顶点的位置,达到对蒙皮动画的物体进行GPUInstancing合批,可适用于草,树木,等大量重复生成的物体.
缺点:项目暂时不能对静态的光照贴图进行烘培,只能先通过烘培阴影,物体身上的阴影和光照可以根据需求显示或隐藏,(之后的研究可以通过材质球获取光照贴图,再把光照贴图叠加到顶点数据中).同一模型处理的数量不能超过1023个,否则会报错,需要进行再分开处理 - SRP Batcher
SRP自带的合批处理,可以将相同shader变体的物体进行合批.变体的意思是,材质球A只有albedo,材质球B也只有albedo,尽管他们的albedo贴图是不同的,
- 静态批处理: