UGUI源码解析——CanvasUpdateRegistry
Posted Hello Bug.
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UGUI源码解析——CanvasUpdateRegistry相关的知识,希望对你有一定的参考价值。
一:前言
CanvasUpdateRegistry是一个单例,它监听了Canvas即将渲染的事件,并调用已注册组件的Rebuild等方法。可以理解为它的作用就是刷新UGUI元素
二:源码解析
首先可以看到ICanvasElement这个接口,每个UGUI的组件都继承自ICanvasElement接口
——Rebuild:重构方法,需要在继承类中实现
——transform:所有组件都继承自Component,而Component类实现了transform属性,所以可以不用再实现transform属性
——LayoutComplete和GraphicUpdateComplete:布局完成的回调和图像更新完成的回调,需要在继承类中实现
——IsDestroy:每个UGUI组件都继承自UIBehaviour类,而UIBehavior类已经实现了IsDestroy方法,所以可以不用再实现IsDestroy方法
CanvasUpdateRegistry类有一个构造函数,给Canvas的静态事件willRenderCanvases注册了一个名为PerformUpdate方法,PerformUpdate中调用了布局和图像的更新
CanvasUpdateRegistry类中有两个注册的方法,RegisterCanvasElementForLayoutRebuild和RegisterCanvasElementForGraphicRebuild,当我们需要更新布局或图像时,可以调用这两个方法将UGUI组件添加到重建序列中,CanvasUpdateRegistry类维护了两个重建序列,一个是布局重建序列一个是图像重建序列
PerformUpdate会对这两个序列中的元素进行更新操作,接下来重点看下PerformUpdate方法内部的实现和执行顺序(我们可以在Profiler中通过查看标志性函数Canvas.willRenderCanvases的耗时,来了解Mesh重建的性能消耗)
1.调用CleanInvalidItems依次遍历m_LayoutRebuildQueue和m_GraphicRebuildQueue序列,删除掉不可用的元素,如果IsDestroy标为true则直接调用LayoutComplete方法或GraphicUpdateComplete方法
2.对m_LayoutRebuildQueue序列按照父对象数量进行排序
3.按照Prelayout、Layout、PostLayout的更新顺序调用m_LayoutRebuildQueue序列中每一个元素的Rebuild方法,然后调用所有元素的LayoutComplete方法并清除所有元素
4.布局完成后调用ClipperRegistry.instance.Cull()进行组件的裁剪
5.按照PreRender、LatePreRender的更新顺序调用m_GraphicRebuildQueue序列中每一个元素的Rebuild方法并清除所有元素
以上是关于UGUI源码解析——CanvasUpdateRegistry的主要内容,如果未能解决你的问题,请参考以下文章