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左右
PREVIOUSTeXt - Extensions
NEXT如何生成C#版的protobuf