系列
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,逐儿时之梦正在游戏制作的技术海洋中漂泊。知道的越多,不知道的也越多。希望我的文章对你有所帮助:)