UGUI CanvasUpdateSystem源码分析,UGUI中脏标记的使用

系列

UGUI源码分析系列总览
html

CanvasUpdateSystem

Related Class: Canvas、CanvasUpdateRegistry、ClipperRegistryweb

Related Interface: ICanvasElement设计模式

Related Other: Enum CanvasUpdatesvg

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 中存在三种脏标分别表明三种等待重建ui

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

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