UGUI优化总结
1.检查空Image
游戏中许多时候会使用一个透明的Image组件来监听点击事件或者屏蔽Image后面的按钮事件,空的Image可以解决这个问题,用起来也很方便,但是空的Image照旧会参与绘制,从而产生overdraw。解决办法是扩展Graphic组件来替换Image组件。
游戏中使用工具检查空Image: 对应prefab上Image组件的Sprite为空或Color.a透明(<0.05f),我们将使用了空Image的prefab列出来手动进行替换。监听事件时还会使用一个Button或者EventTrigger来实现,这种需着重检查。工具见末尾链接地址。
2.优化九宫格Image
九宫格图像使用的也比较多,Image选为Sliced类型后会有一个fillCenter选项,默认情况下该选项是勾选的,但如果九宫格的中间区域为透明图像,其实不需要勾选fillCenter,从而降低overdraw。所以我们需要使用工具检测该Image的sprite的中心区域
是否为透明,将透明的prefab列出来供检查。
3.检查Mask组件
Mask组件也会被用到,最多是用在ScrollView中,网上也有很多资料介绍Mask组件会产生额外的两个drawcall,而大部分时候Mask都是矩形的,所以其实可以使用RectMask2D组件来替换掉Mask组件,官方也比较推荐RectMask2D组件,
但如果你的Mask组件不是矩形的那么就不能替换。
4.检查错误透明材质
项目中有很多材质美术设置有些问题,从而影响性能,其中一个就是Material所使用的纹理是RGB格式或者虽然RGBA格式但是A通道为1,但是美术却给使用了一个透明的Shader进行渲染,这种设置虽不会出错但是会影响性能。所以我们需要检测出
renderType为Transparent或者TransparentCutout类型,并且他的renderQueue>2000(2000为Geometry)且<=3000(3000为Transparent)的材质,如果他的主纹理不透明,则列举出使用了这种材质的prefab或者Scene,以便检查。
5.错误的UI设置
之前在检查一个UI合批失效的问题,明明打了图集,但就是不能合批,很是诧异,经过测试发现如果你的Image组件pos.z不为零或者rota.x或rota.y不为零,那么会被当作3DUI从而不参与合批,增加drawcall,而这些非零值有时往往是不需要甚至是
不注意被设置上的,但却影响了这个合批,很是坑人。所以需要用工具检查这种被设置错误的UI,酌情进行重置。
工具地址:https://gitee.com/planefight/Tools.git