UGUI性能优化

①Cavas的Render Mode是Overlay模式时,永远覆盖在其他物体之上,不受摄像机depth影响    

②Cavas的Render Mode都是Screen Space-Camera时的渲染顺序:

        依次由选取的摄像机Render Camera的Depth值、Cavas的Sorting Layer先后顺序(可上下拖动调节顺序)、Order in Layer值决定

           UGUI性能优化_第1张图片

③只有一个摄像机时,由 距离(Plane Distance)和 方向(跑到UI后边字是反的,解决方案:复制一份这个UI旋转180度,其他参数都一样即可)决定World模式和Camera模式下的渲染结果,可前可后可穿插。

UGUI中DC的渲染顺序,是在Hierarchy面板下越靠下,越靠后渲染,越显示在前面:(DC的合并只有UI元素重叠的时候才会有合并的顺序)

        同一canvas下:

     改变控件transform的SiblingIndex,
     transform.GetSiblingIndex();

     transform.SetSiblingIndex(int index); //index值越大,越后渲染,层级越大,越显示在前面

        不同Canvas下:

    设置Canvas下的Sort Order //Sort Order值越大,越后渲染,层级越大,越显示在前面

所以,在设计UI的时候要注意每个item(比如这里的Button)中的使用不同图集的UI元素越少越好,且在排列的时候尽量让来自不同图集的UI元素不重叠,如下图           如果不重叠,正常放置DC是3(①和②的sprite会自动合并为一个DC ,text也是合并为一个)。一旦重叠,会打乱原来的渲染拓扑关系,造成DC上升。

UGUI性能优化_第2张图片

-------->注意Mask的使用,避免没必要的Mask增加DC

        UGUI性能优化_第3张图片

----------->要注意避免UI元素,重叠到其他元素 (如下图,右边武器的线框已经压到左边的item了),所以可以改下icon的size(width hight等)

        UGUI性能优化_第4张图片

------------>OverDraw 对于一些使用图片使用Slice的时候,我们可以对于不需要中心的反勾选掉Fill Center选项,来镂空中心部分。可以看到下图每个item的中心其实是不必要渲染的。

        UGUI性能优化_第5张图片

UGUI性能优化_第6张图片

 对于一些诸如点击屏幕任意位置,达到关闭当前窗口的效果,很多人习惯放一个panel(Image)然后选择空的sprite,来接收事件点击,但这样依然形成OverDraw。所以我们可以用网上的一个脚本(继承了事件点击的类,但是panel上去掉Image)。如下图

        UGUI性能优化_第7张图片

UGUI性能优化_第8张图片

------------------->事件检测的优化     UGUI在手指点击的时候,其实是Cavas上挂的一个Graphic Raycaster组件去遍历整个Cavas下所有UI元素下RayCast Target属性是否允许点击,所以我们可以把不允许点击的UI元素反勾选掉这个选项,减小开销。如下图

        UGUI性能优化_第9张图片           UGUI性能优化_第10张图片

------------>>>>>对于UGUI网格的重建    它是以Cavas为单位进行的,整个Cavas下边的UI元素合并成一个Mesh进行更新。

    动静分离:具体做法是把正在移动的元素挂上一个Cavas,并修改它的sort order,为了操作方便我们是在脚本中去检测到当前移动的元素,并给它挂上Cavas。当不再移动后,再销毁这个Cavas即可。

    UGUI性能优化_第11张图片

对于一些需要高亮时,边框颜色渐变的需求,我们如果直接去修改Image上自带的Color属性实际上是修改的是它的顶点上的属性,这样的话会造成整个Cavas的网格重建,所以我们可以去自己创建一个自定义材质赋给Image,去改变材质的Tint Color属性。

    UGUI性能优化_第12张图片

UGUI性能优化_第13张图片       UGUI性能优化_第14张图片                       UGUI性能优化_第15张图片


你可能感兴趣的:(Unity性能优化,UGUI)