1.Draw Call
原理:一个模型的数据经过CPU传输到GPU,并命令GPU进行绘制,称为一个DrawCall
降低Draw Call的原理:基于DrawCall 是CPU调用底层图形接口,主要工作量就是尽量减少CPU在调用图形接口上的开销而努力。
降低Draw Call的思路:每个游戏对象尽量减少渲染的次数,多个游戏对象尽量一起渲染
降低Draw Call的主要途径:
(1):Draw Call 批处理技术(DrawCall Batching)
核心:在可见性测试之后,检查所有要绘制的对象材质,把相同材质分为一组,然后把它们组合成一个对象,这样一次Draw Call就可以处理对个对象
动态批处理:完全自动进行
静态批处理:需要指出哪些是静态的,再属性窗口中将“Static”复选框勾选
(2):使用图集(Texture Packing或者Texture Atlasing)减少材质的使用
尽量减少场景中使用的材质数量,尽量共享材质,对于仅纹理不同的材质,可以把纹理组合到一张更大的纹理中(称为图集Texture Packing 或者Texture Atlasing),然后把不会移动的物体标记为“Static”
(3):尽量减少使用反光,阴影,因为那会使物体多次渲染
(4):视锥体合理剪辑(FrustumCulling )
视锥体合理剪辑是Unity内建的功能,一般来说,对于大型场景中的大量游戏对象进行合理的分层,对于大型建筑物使用较大裁剪距离,而对于小游戏对象可以使用较小裁剪距离,场景中的粒子系统等可以使用更小的裁剪距离
(5)遮挡剔除方法
(6)网格渲染器
只有处于摄像机视锥体内,且添加了网格渲染器(Mesh Renderer)组件的对象才会产生渲染的开销,其他不产生,这样我们可以对暂时无需显示的游戏对象通过脚本的方式进行控制,不进行渲染,需要的时候再渲染即可
(7)减少游戏对象的缩放
统一缩放的对象不会与非统一缩放的对象进行批处理
(8)减少多通道Shader的使用
多通道的Shader会妨碍批处理操作:几乎Unity中所有的着色器在前向渲染中都支持多个光源,因为它们开辟多个通道,所以对批处理有影响
(9)脚本访问材质的方法
如果需要脚本访问复用材质属性,如使用Renderer.material改变贴图,则将会造成一份材质。因此一般使用Renderer.ShaderMaterial来保证材质的共享状态
(10)尽量多使用预设
使用预设生成的对象会自动的使用相同的网格模型和材质,因此会自动被批处理