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 > 面片