Fork me on GitHub

UGUI优化

  UGUI网格重建

  UGUI网格重建是以Canvas为单位进行的,整个Canvas下面的UI元素会合并成一个Mesh进行更新。

  1. 动静分离。把Canvas下面动态的元素拆分到另外一个Canvas下面。

  2. 对于一些UI颜色变化,不去修改image上自带的color属性(实际修改的是image顶点上的属性),改为创建一个自定义的材质赋给image,然后去改变材质的Color。

  事件监测

  UGUI的事件监测,其实是Canvas下面挂了一个Graphic Raycaster组件去遍历整个Cavas下所有UI元素下RayCast Target属性是否允许点击。所以把不需要点击的UI元素的Raycast Target勾选掉。

  当需要有透明层做事件监听时,为了防止UI重叠,可以去掉image组件然后使用脚本代替image组件下Raycast Target属性。

public class NoDrawingRayCast : UnityEngine.UI.Graphic
    {
        public override void SetMaterialDirty()
        {
        }
        public override void SetVerticesDirty()
        {
        }

#pragma warning disable CS0672 // Member overrides obsolete member
        protected override void OnFillVBO(List<UIVertex> vbo)
#pragma warning restore CS0672 // Member overrides obsolete member
        {
//            vbo.Clear();
        }
    }

  Overdraw

  在某个背景上有个按钮,要将俺就绘制在背景上,这个就是Overdraw,Overdraw无法避免,只能选择优化降低

  1. 文字部分

  主要是使用了Outline,Outline实现方式是将Text的四个顶点传过去复制四份。可以尝试使用Textmesh Pro或者采用Shader

  使用Shadow

  字体在image上方,UGUI会自定检测优化

  2. Mask

  Unity的Mask组件会增加一层Overdraw,还会增加4个DrawCall。解决方法:

  1)尽量不用

  2)使用RectMask2D代替,缺点只能用于矩形。

  3)使用MeskMask。参考地址:https://www.cnblogs.com/leoin2012/p/6822859.html

  3. 图片属性

  对于slide九宫格图片,如果能取消Fill Center属性就取消它,这样中心区域就不会渲染

  图片重合的地方,能不重合就不要重合

  取消无用的image组件

  Image图片不设置Tiled类型

 

注:

  在渲染上,GPU、CPU两者的性能瓶颈往往是CPU;GPU的性能瓶颈往往是像素点填充率(Overdraw导致),CPU的性能瓶颈往往是Drawcall。所以,渲染性能排查,几项指标关注优先级应该是:Drawcall > Overdraw > 面片  

posted @ 2020-02-27 16:20  骑驴看世界  阅读(555)  评论(0编辑  收藏  举报