系列
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 管理着兩個隊列
- LayoutRebuildQueue:佈局重建
- GraphicRebuildQueue:圖像重建
CanvasUpdateRegistry 被初始化時(構造函數)向Canvas中註冊了更新函數(PerformUpdate),以用來響應重建。
Canvas.willRenderCanvases += PerformUpdate;
Canvas在渲染前會調用willRenderCanvases,即執行PerformUpdate ,流程如下:
- 首先更新佈局,根據父節點多少排序,由內向外更新。更新類型依次爲 Prelayout 、Layout 、PostLayout(enum CanvasUpdate)
- 通知佈局完成
- ClipperRegistry 進行剪裁
- 更新圖像,依次 PreRender、LatePreRender、MaxUpdateValue
- 通知圖像更新完成
髒標記
標記延遲執行,優化重新渲染的手段。
詳情請見:遊戲設計模式:髒標識模式
例如在Graphic 中存在三種髒標分別代表三種等待重建
- 尺寸改變時(RectTransformDimensions):LayoutRebuild 佈局重建
- 尺寸、顏色改變時:Vertices to GraphicRebuild 圖像重建
- 材質改變時:Material to GraphicRebuild 圖像重建
層級改變、應用動畫屬性(DidApplyAnimationProperties) :All to Rebuild 重建所有
.
.
.
.
.
嗨,我是作者Vin129,逐兒時之夢正在遊戲製作的技術海洋中漂泊。知道的越多,不知道的也越多。希望我的文章對你有所幫助:)