UGUI源碼分析:CanvasUpdateSystem 畫布刷新系統

系列

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,逐兒時之夢正在遊戲製作的技術海洋中漂泊。知道的越多,不知道的也越多。希望我的文章對你有所幫助:)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章