UGUI优化方案

UGUI是unity中很常见的ui解决方案,但在实际项目中,对于UGUI的使用是否高效呢?这个就因人而异了!下面我们就来盘点一下UGUI有哪些是性能的瓶颈和应该如何去优化!

Canvas的Pixel Perfect

谨慎使用Canvas的Pixel Perfect选项,该选项会使得ui元素在发生位置变化时,造成layout Rebuild。(比如ScrollRect滚动时,如果开启了Canvas的pixel Perfect,会使得Canvas.SendWillRenderCanvas消耗较高)

RaycastTarget的消耗及其原理

在这里,我们就不得不说一下EventSystem的一些机制的,为了查找这个原因,本人还特意download了官方的开源代码。废话不多说,直入主题:

RaycastTarget消耗的原理

直接上ui事件的大概流程图

graph TB
A["EventSystem.Update"]-->B["CurrentInputModule.Process"]
B-->C["GetMousePointerEventData"]
C-->D["eventSystem.RaycastAll"]
D-->E["遍历GraphicRaycaster.Raycast"]
E-->F["遍历Graphic组件"]
F-->G{"graphic.raycastTarget"}
G-->H["rectTransform是否包含鼠标点"]

注意: graphic.raycastTarget 并不是单一只判定raycastTarget,源代码只这样的

if (graphic.depth == -1 || !graphic.raycastTarget || graphic.canvasRenderer.cull)
    continue; 

本文以Text组件为例说明一下控件是如何和EventSystem产生联系的:

Text组件的声明:

public class Text : MaskableGraphic, ILayoutElement
{}

MaskableGraphic组件的声明:

public abstract class MaskableGraphic : Graphic, IClippable, IMaskable, IMaterialModifier
{}

看到这里,有点基础的都应该能看得出来,Text是通过 Graphic 遍历Graphic组件 的时候被 EventSystem 获知

RaycastTarget消耗的解决方法

减少 raycastTarget的开启

Canvas的Rebuild消耗及其原理

分辨率

不同机型对应不同的ScreenResolution,降低移动设备的渲染损耗

字体库不要使用过度庞大的

一般游戏都是使用2钟左右,每种字体库大小一般是10m左右