flutter中的drawFrame
【摘要】 本文主要介绍RendererBinding.drawFrame() 负责生成帧。这个方法对于理解 Flutter 渲染过程非常重要。简单了解下。RendererBinding.drawFrame() 由 SchedulerBinding.handleDrawFrame() 方法调用,而后者又自动被引擎调用(如果引擎需要布局和绘制一帧的话)。RendererBinding.drawFrame(...
本文主要介绍
RendererBinding.drawFrame()
负责生成帧。这个方法对于理解 Flutter 渲染过程非常重要。简单了解下。
RendererBinding.drawFrame()
由 SchedulerBinding.handleDrawFrame()
方法调用,而后者又自动被引擎调用(如果引擎需要布局和绘制一帧的话)。
RendererBinding.drawFrame()
的源码如下:
void drawFrame() {
assert(renderView != null);
// 布局
pipelineOwner.flushLayout();
// 检查是否需要重绘
pipelineOwner.flushCompositingBits();
// 重绘
pipelineOwner.flushPaint();
renderView.compositeFrame(); // this sends the bits to the GPU
pipelineOwner.flushSemantics(); // this also sends the semantics to the OS.
}
flushPaint()
调用 PaintingContext.repaintCompositedChild(node)
方法,后者是真正的绘制逻辑。
每帧由以下几个阶段组成:
-
动画阶段 -
SchedulerBinding.handleBeginFrame
(由Window.onBeginFrame
注册),按注册顺序调用所有的临时帧回调 (由scheduleFrameCallback
注册)。这些回调包括所有用于驱动AnimationController
对象的Ticker
实例,即该时间点的所有活跃Animation
对象。 -
Microtasks -
handleBeginFrame
返回后,由临时帧回调注册的方法调度的 microtasks 开始运行。之后,由Window.onDrawFrame
注册的handleDrawFrame
回调开始执行,它调用所有的持久帧回调。其中最重要的是drawFrame
方法,它的处理过程如下 -
布局阶段 - 对系统中的所有标记为脏的
RenderObject
(如何将对象标脏以便布局,可参考RenderObject.markNeedsLayout
) 进行布局 -
compositing bits 阶段 - 更新所有标脏
RenderObject
中的 compositing bits。具体参考RenderObject.markNeedsCompositingBitsUpdate
-
绘制阶段 - 系统中的所有标脏
RenderObject
被重绘。这个过程生成Layer
树。如何将对象标脏以便绘制,可参考RenderObject.markNeedsPaint
-
合成阶段 - 将 layer tree 转换成
Scene
并发送到 GPU -
semantics 阶段 - 系统中的所有标脏
RenderObject
的 semantics 被更新。具体见RenderObject.semanticsAnnotator
。这个过程生成SemanticsNode
树。如何将对象标脏以用于 semantics,可参考RenderObject.markNeedsSemanticsUpdate
-
步骤 3-7 的细节请参考
PipelineOwner
-
结束阶段 -
drawFrame
返回后,handleDrawFrame
调用 post-frame 回调。(由addPostFrameCallback
注册)
注意:某些绑定会向上述过程添加额外步骤,比如,WidgetsBinding
会添加 WidgetsBinding.drawFrame
。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
评论(0)