UGUI drawcall优化思路(以主界面优化为例)

图集内图片管理命名的以后以图集名_的形式区分比如MainUI_
由于mmorpg游戏主界面的特殊性,在游玩游戏的时候,主界面会一直处于开启常驻的状态,不像我们打开其他的界面的时候会关闭主摄像机,场景物件的drawcall都会不计算在当前drawcall数中。我们要做的就是把主界面的drawcall优化到极致,专门建一个Atlas_MainUI图集,主界面上所有用到的图片,不管重复与否,都在这个图集里加一份,基于这个思路,我们后来在做图集内存优化的时候把Atlas_MainUI图集直接合并到了Atlas_Common里,也就是主界面上的所有东西,直接使用Atlas_Common图集。这样做的好处1是方便优化drawcall,2降低了在主城操作情况下图集内存的占用,做的好坏还是差了几十兆内存的。下面上优化之前的图
工具1 drawcall优化
UGUI drawcall优化思路(以主界面优化为例)

工具2
UGUI drawcall优化思路(以主界面优化为例)
下面是优化过程中碰到的没做好的地方,供大家避坑
1、老图集没用新图集替换掉导致的合批失败
2、用错字体导致合批失败 这个很伤,一个字体用错会导致3个额外drawcall
3、不必要的canvas导致不必要的大量drawcall
4、空的image不给任何图集会产生drawcall,不要显示着透明度调成0
5、通过framedebuger看哪一步阻碍了合批
6、滚动控件里子元素千万不要手抖加上了canvas,不然带来的开销将是灾难性的,直接打开prefab搜索canvas可以搜到控件上是否有canvas组件
7、text在优化的时候,发现一个很严重的问题,就是字体和图片的层级关系会影响合批,字体在图片区域内和区域外合批是不同的,字体遮挡图片和被图片遮挡合批是不同的,组件只需要相互遮挡住一点点,结果就不一样,要渲染出来的区域的遮挡关系,打几个空格是不起作用的,同理,图片与图片的遮挡关系别搞错了
8、outline对合批的影响 outline不会影响合批
9、根据调节会打断合批的点的上下顺序,达到减少drawcall的效果

理论上讲,主界面最佳的优化效果是只占有2个drawcall,但是在实际操作中,由于无法避免的滚动控件、mask、效果材质球等的使用,最终优化后的主界面drawcall停留在了10个。其他界面的drawcall优化思路和主界面的优化思路大致相同。有的时候必须要使用mask做小地图,在图集里加入一个白色图片,赋值到mask用的空image中,可以减少一个drawcall。

上一篇:Unity工程性能优化学习笔记


下一篇:U3D面试题