天天看点

unity UGUI 优化重点

一、UI元素的 batch

      batch字面意思即是“一批”、“分批处理”的意思,即把符合条件的UI元素打包成一批让GPU一次性的把他们绘制出来, 这大体可以理解为在1个drawcall内绘制完这批UI元素,这样肯定会比一个一个的让GPU分别绘制效率要低的多。所以在unity  p的profile或status中看到的batch的数目越少越好(假如一帧内有100个UI元素,分成50个批次让GPU去绘制肯定要比分成80 个 批次绘制性能好,相当于drawcall少了,当然好了)。那么符合什么条件的UI元素会被打入同一个batch呢?答案就是要符合下面几个条件:

       1、在同一个canvas下。假如有10个canvas,那么肯定至少会有10个batch。

       2、使用同一个材质,道理显而易见,绘制的方法都不一样怎么能打成一批去一次性绘制呢?

       3、用到的texture在同一个sprite资源上,可以简单理解为在同一图集上。

       4、他们的RectTransform共面,即世界坐标的z值相同,(有时候可能还要求在屏幕上不重叠,这也可能导致drawcall激增,尤其是在使用layoutgroup组件的时候,一定要注意其子元素间的间距)。

       5、在同一个父mask下。mask组件是常见的造成drawcall激增的很重要的一个原因。

二、节省CPU的方法

       1、不用响应点击等交互事件的Image组件等,把RaycastTarget属性点掉。

       2、有动画的和没动画UI元素分开(可以放在不同Canvas下,但是代价是增加drawcall,所以需要权衡,原理是在绘制前, 实际上CPU会把所有UI元素网格组合成一个mesh去绘制,即网格重建(rebuild),这是个挺耗费的事情,如果这一帧与前一帧的UI元素没有变化则不会重建网格。个别UI元素的动画(大小、缩放、位置变化、物体显示隐藏)、Image的color属性的变化等都会导致网格重组,加大CPU的负担。

三、减少overdraw。所谓overdraw可以理解为过度绘制,可以简单理解为在屏幕上同一块区域内让GPU重复绘制了几次,比如重叠的两个Image,他们重叠的部分就是overdraw的区域。常见的优化方法是

         1、如果Image组件的Image Type为slice,则  其Fill Center属性能不点就不点。想要了解场景overdraw的情况,可以在场景视图的左上角的下拉菜单设置中,选中overdraw, 此时场景会表现出overdraw的情况,越亮的部分overdraw越严重,如下图所示:

unity UGUI 优化重点
unity UGUI 优化重点

        2、隐藏Image元素时不要用是alpha为0的方法,而要用gameObject.setactive(false);

继续阅读