您的位置:首页 > 产品设计 > UI/UE

UGUI源码分析:CanvasUpdateSystem 画布刷新系统

2020-06-29 04:45 1251 查看

系列

UGUI源码分析系列总览

文章目录

CanvasUpdateSystem

Related Class: Canvas、CanvasUpdateRegistry、ClipperRegistry

Related Interface: ICanvasElement

Related Other: Enum CanvasUpdate

Intro: 由Canvas控制,通过 ICanvasElement 接口,使用脏标记方法来统一更新CanvasElement

ICanvasElement

  • 重建方法:void Rebuild(CanvasUpdate executing);
  • 布局重建完成:void LayoutComplete();
  • 图像重建完成:void GraphicUpdateComplete();
  • 检查Element是否无效:bool IsDestroyed();

PerformUpdate

Registry 管理着两个队列

  1. LayoutRebuildQueue:布局重建
  2. GraphicRebuildQueue:图像重建

CanvasUpdateRegistry 被初始化时(构造函数)向Canvas中注册了更新函数(PerformUpdate),以用来响应重建。

Canvas.willRenderCanvases += PerformUpdate;

Canvas在渲染前会调用willRenderCanvases,即执行PerformUpdate ,流程如下:

  • 首先更新布局,根据父节点多少排序,由内向外更新。更新类型依次为 Prelayout 、Layout 、PostLayout(enum CanvasUpdate)
  • 通知布局完成
  • ClipperRegistry 进行剪裁
  • 更新图像,依次 PreRender、LatePreRender、MaxUpdateValue
  • 通知图像更新完成

脏标记

标记延迟执行,优化重新渲染的手段。
详情请见:游戏设计模式:脏标识模式

例如在Graphic 中存在三种脏标分别代表三种等待重建

  1. 尺寸改变时(RectTransformDimensions):LayoutRebuild 布局重建
  2. 尺寸、颜色改变时:Vertices to GraphicRebuild 图像重建
  3. 材质改变时:Material to GraphicRebuild 图像重建

层级改变、应用动画属性(DidApplyAnimationProperties) :All to Rebuild 重建所有

.
.
.
.
.

嗨,我是作者Vin129,逐儿时之梦正在游戏制作的技术海洋中漂泊。知道的越多,不知道的也越多。希望我的文章对你有所帮助:)

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐