UGUI优化相关

发布时间 2023-12-21 15:34:54作者: mc宇少

1.打断合批的操作:

1.材质和图片的不同(相同的图集不算图片不同,本质上都是用的那个图集)。

2.Mesh重叠:有重叠的UI肯定不是一个批次。还有一种重叠情况也会打断:三张没有重叠的image中间夹杂一个text,合批会被text打断,但text两边的image可以合批。

3.Mask:下面说

4.UI层次结构发生变化:新增、删除都会引起整个CanvasUI顺序更新。

2.Mask

Mask的实现是使用模板缓冲,要额外增加两个dc,一个用来在绘制元素前修改模板缓冲的值,另一个用来在所有UI绘制完后将模板缓冲的值回复原样。

Mask的dc数是两个额外drawcall再加上mask下面的UI的drawcall,多个Mask之间可以合批(多个mask的第一个dc、第二个dc、下面的子物体的dc可以合批),Mask和外面的UI不能合批。重叠的Mask(mask的子物体有重叠也不能合批,哪怕重叠的部分没显示出来)不能合批。

RectMask2D是在C#层先将UI不在其父物体矩形范围内的顶点透明度设置为0,然后通过Shader丢弃掉透明度小于0.001的元素,不需要创建新的材质所以也不需要增加额外的dc,但会打断合批。

RectMask的dc数就是子物体的dc数(子物体可以合批),但多个RectMask不可以合批,RectMask和其他UI也不可以合批。

使用环境:

当需要使用不规则遮罩的话那就只能使用Mask,其他情况看需要遮罩的数量,如果多就使用Mask(可以合批,额外的dc可以忽略),少的话就RectMask2D。

3.Rebuild和Rebatch

在Unity的UGUI系统中,Rebuild和Rebatch是两个关键的性能消耗点。

1.rebuild

Rebuild发生在C#层面,是指UGUI库中layout组件调整RectTransform尺寸、Graphic组件更新Material,以及Mask执行Cull的过程。

主要包括两个部分:

1.布局重建(LayoutRebuild)

CanvasUpdateRegistry.TryRegisterCanvasElementForLayoutRebuild(rebuilder)

当UI元素的布局需要更新时,例如SetActive、transform的改变、颜色改变、文本内容改变等会触发SetLayoutDirty的操作。

2.图形重建(GraphicRebuild)

CanvasUpdateRegistry.RegisterCanvasElementForGraphicRebuild(this)

当UI元素的图像需要更新时,例如基本的大小、旋转以及以及文字的变化、图片的修改等等。

 

rebuild的操作就是将发生改变的UI放到CanvasUpdateRegistry.m_LayoutRebuildQueue和CanvasUpdateRegistry.m_GraphicRebuildQueue中,在Canvas.willRenderCanvases(会在渲染前进行每帧调用)中遍历并调用其Rebuild()方法(重建网格、更新材质、重新layout)

2.Rebatch

Rebatch发生在C++层面,是指Canvas分析UI节点生成最优批次的过程。Batch以Canvas为单位,同一个Canvas下的UI元素最终都会被Batch到一个Mesh中。Batch前,UGUI根据UI材质以及渲染顺序重排,在不改变渲染结果的前提下,尽可能将相同材质的UI元素合并在同一个SubMesh中,以减少DC。Batch只在UI元素发生变化时进行,合成的Mesh越大,耗时越大。重建对Canvas下所有ui元素生效,不论是否修改过。

触发条件:

1.Mesh发生改变:例如SetActive、transform的改变、颜色改变、文本内容改变等。

2.Canvas数据更新,这个就是Canvas自己掌控了,我们无法干涉。

3.UI层次结构发生改变,新增、删除UI或UI子节点。

优化

针对Rebatch的优化主要是针对这个过程的速度进行优化(毕竟基本只要改UI就会触发这个)。

1.动静分离,缩小更新的canvas的复杂度,将频繁变动的UI和不变的UI放到两个Canvas中。

2.减少节点层次和数量:合批计算量小。

3.使用相同材质的Ui尽量保持深度相同:这样对合批算法友好,速度快。

4.尽量不要打断合批。

 4.图集相关

1.图集的尺寸越小越好,毕竟越小的图集加载越快。

2.同一个界面的图集打到一起,这样界面的图片都可以合批并且只需要加载这一张图集。

3.上限设为1024或者2048,有图片宽高超过的话就单独拿出来或者分成两张做成两个UI。

4.图集设置:间隔、压缩格式、mipmap(UI基本不需要,贴图可能需要)等

5.一个界面过大导致一个图集不够的话可以分成两个或者加大图集尺寸(权衡)。

6.当图集设置和图集内图片的设置冲突的情况以图片为准(这个最好用工具弄,导入图片和打图集都自动化,防止出错)。

7.图集中图片发生粘连可以调整图片的meshtype或者增加图片精度。