前言:Draw Calls是影响GPU性能的主要因素之一,过多的Draw Calls会严重影响渲染效率。
2D UGUI
首先,按照一定策略打图集肯定是必须的
新建空场景运行,是两个dc,如图所示,两个图集,一个字体,需要三个dc绘制,说明这样排列不会打断批处理
一旦某个UI打断批处理,就会从该UI开始单独渲染,然后下面的从新开始合批
打断批处理的情况有
- 修改某个UI的X或Y的旋转
- 增加Mask或者Rect Mask2D
优先使用RectMask2D:
RectMask2D比Mask更高效,因为它只裁剪矩形区域。
如果不需要复杂的遮罩效果,尽量使用RectMask2D。
减少Mask的使用:
尽量避免嵌套使用Mask组件。
如果必须使用Mask,确保其影响范围尽可能小。
- 增加Canvas
4.父子关系之间遮挡
5.某个UI的Z轴不同
等等…
利用好Frame Debugger,你就会明白为什么没有合批
3D
渲染顺序调整
比如这种情况
三个规格一样深度不同的物体,如果他们的渲染顺序都是3000,那么,渲染顺序就是
物体1,特效1,物体2,特效2,物体3,特效3
只需要调整一下特效的Render Queue为3001,渲染顺序就是
三个物体一起,三个特效一起
如果材质球相同,但是在实例化的时候修改了属性(比如material.SetFloat),这时候,即使相同的材质也会被Instance出来,被认为是不同的材质,有些时候可以用这样的方法代替
MaterialPropertyBlock mpb = new MaterialPropertyBlock();
Renderer renderer = cube.GetComponent<Renderer>();
mpb.SetFloat(...)
renderer.SetPropertyBlock(mpb);