区块链技术博客
www.b2bchain.cn

Flutter 核心原理:Flutter帧渲染的整体流程求职学习资料

本文介绍了Flutter 核心原理:Flutter帧渲染的整体流程求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

在《Flutter 核心原理:Widget、Element和RenderObject是如何协同工作的》文章中介绍了Widget、Element和RenderObject这三个概念各自的职责。然而这只是Flutter帧渲染流程中的一部分。Flutter帧渲染的整体流程并不是只在Flutter Dart层中完成的。整个流程涉及到跨越多个技术层的互相协作,包括Platform层(Android、iOS…),Flutter Engine层和Flutter Dart层

首先,不管是手机还是电脑,为了更新显示画面,显示器是以固定的频率刷新的。当一帧图像绘制完毕后准备绘制下一帧时,显示器会发出一个垂直同步信号(如VSync)。而垂直同步信号也是Flutter帧渲染开始的起点

垂直同步信号一般是由Platform(Android、iOS..)发出,依次传递到Flutter Engine层和Dart层,触发Flutter帧渲染
Flutter 核心原理:Flutter帧渲染的整体流程
如以上示意图所示,Flutter通过一些跨语言调用的方式,把Vsync信号层层传递,最终到达Flutter Dart层。Flutter Dart层中的_beginFrame和_drawFrame方法提供给Flutter Engine层调用的,最终触发Window.onBeginFrame和Window.onDrawFrame方法进行帧绘制逻辑。在Flutter架构中使用了多种跨语言的调用方式,在以后的文章中再详细介绍。

// hooks.dart部分源码 // 由于_beginFrame和_drawFrame函数是提供给Flutter Engine层调用,Dart中没有地方引用,预处理命令@pragma('vm:entry-point')是为了告诉编译器不要去除这个未引用的方法。  @pragma('vm:entry-point') // ignore: unused_element void _beginFrame(int microseconds) {   // 调用window.onBeginFrame方法   _invoke1<Duration>(window.onBeginFrame, window._onBeginFrameZone, Duration(microseconds: microseconds)); }  @pragma('vm:entry-point') // ignore: unused_element void _drawFrame() {   // 调用window.onDrawFrame方法   _invoke(window.onDrawFrame, window._onDrawFrameZone); } 

从Window.onBeginFrame和Window.onDrawFrame方法开始就触发了Flutter Dart层的帧绘制逻辑, 主要包含以下一些步骤:

Flutter 核心原理:Flutter帧渲染的整体流程

可以看到这里会通过我们熟悉的Widget Tree和Element Tree生成绘制树RenderObject Tree。RenderObject Tree会再进行Layout布局和Paint渲染等步骤。这里的Paint渲染并不是真正的渲染而是为了生成Layer TreeLayer Tree主要用来存储渲染相关的指令和参数,每个RenderObject绘制时,会把相关的绘制指令和绘制参数,存储在对应的Layer上

根据以下示例代码可以看到TextureBox的paint方法定义了自身的Layer(TextureLayer)记录了绘制信息,并且添加到Layer Tree中:

   //TextureBox部分源码 class TextureBox extends RenderBox {    ...   @override   void paint(PaintingContext context, Offset offset) {     if (_textureId == null)       return;     context.addLayer(TextureLayer(       rect: Rect.fromLTWH(offset.dx, offset.dy, size.width, size.height),       textureId: _textureId,     ));   }    ... } 

在《Flutter 核心原理:Widget、Element和RenderObject是如何协同工作的》文章中介绍了Widget、Element和RenderObject这三个概念各自的职责。然而这只是Flutter帧渲染流程中的一部分。Flutter帧渲染的整体流程并不是只在Flutter Dart层中完成的。整个流程涉及到跨越多个技术层的互相协作,包括Platform层(Android、iOS…),Flutter Engine层和Flutter Dart层

首先,不管是手机还是电脑,为了更新显示画面,显示器是以固定的频率刷新的。当一帧图像绘制完毕后准备绘制下一帧时,显示器会发出一个垂直同步信号(如VSync)。而垂直同步信号也是Flutter帧渲染开始的起点

垂直同步信号一般是由Platform(Android、iOS..)发出,依次传递到Flutter Engine层和Dart层,触发Flutter帧渲染
Flutter 核心原理:Flutter帧渲染的整体流程
如以上示意图所示,Flutter通过一些跨语言调用的方式,把Vsync信号层层传递,最终到达Flutter Dart层。Flutter Dart层中的_beginFrame和_drawFrame方法提供给Flutter Engine层调用的,最终触发Window.onBeginFrame和Window.onDrawFrame方法进行帧绘制逻辑。在Flutter架构中使用了多种跨语言的调用方式,在以后的文章中再详细介绍。

// hooks.dart部分源码 // 由于_beginFrame和_drawFrame函数是提供给Flutter Engine层调用,Dart中没有地方引用,预处理命令@pragma('vm:entry-point')是为了告诉编译器不要去除这个未引用的方法。  @pragma('vm:entry-point') // ignore: unused_element void _beginFrame(int microseconds) {   // 调用window.onBeginFrame方法   _invoke1<Duration>(window.onBeginFrame, window._onBeginFrameZone, Duration(microseconds: microseconds)); }  @pragma('vm:entry-point') // ignore: unused_element void _drawFrame() {   // 调用window.onDrawFrame方法   _invoke(window.onDrawFrame, window._onDrawFrameZone); } 

从Window.onBeginFrame和Window.onDrawFrame方法开始就触发了Flutter Dart层的帧绘制逻辑, 主要包含以下一些步骤:

Flutter 核心原理:Flutter帧渲染的整体流程

可以看到这里会通过我们熟悉的Widget Tree和Element Tree生成绘制树RenderObject Tree。RenderObject Tree会再进行Layout布局和Paint渲染等步骤。这里的Paint渲染并不是真正的渲染而是为了生成Layer TreeLayer Tree主要用来存储渲染相关的指令和参数,每个RenderObject绘制时,会把相关的绘制指令和绘制参数,存储在对应的Layer上

根据以下示例代码可以看到TextureBox的paint方法定义了自身的Layer(TextureLayer)记录了绘制信息,并且添加到Layer Tree中:

   //TextureBox部分源码 class TextureBox extends RenderBox {    ...   @override   void paint(PaintingContext context, Offset offset) {     if (_textureId == null)       return;     context.addLayer(TextureLayer(       rect: Rect.fromLTWH(offset.dx, offset.dy, size.width, size.height),       textureId: _textureId,     ));   }    ... } 

在《Flutter 核心原理:Widget、Element和RenderObject是如何协同工作的》文章中介绍了Widget、Element和RenderObject这三个概念各自的职责。然而这只是Flutter帧渲染流程中的一部分。Flutter帧渲染的整体流程并不是只在Flutter Dart层中完成的。整个流程涉及到跨越多个技术层的互相协作,包括Platform层(Android、iOS…),Flutter Engine层和Flutter Dart层

首先,不管是手机还是电脑,为了更新显示画面,显示器是以固定的频率刷新的。当一帧图像绘制完毕后准备绘制下一帧时,显示器会发出一个垂直同步信号(如VSync)。而垂直同步信号也是Flutter帧渲染开始的起点

垂直同步信号一般是由Platform(Android、iOS..)发出,依次传递到Flutter Engine层和Dart层,触发Flutter帧渲染
Flutter 核心原理:Flutter帧渲染的整体流程
如以上示意图所示,Flutter通过一些跨语言调用的方式,把Vsync信号层层传递,最终到达Flutter Dart层。Flutter Dart层中的_beginFrame和_drawFrame方法提供给Flutter Engine层调用的,最终触发Window.onBeginFrame和Window.onDrawFrame方法进行帧绘制逻辑。在Flutter架构中使用了多种跨语言的调用方式,在以后的文章中再详细介绍。

// hooks.dart部分源码 // 由于_beginFrame和_drawFrame函数是提供给Flutter Engine层调用,Dart中没有地方引用,预处理命令@pragma('vm:entry-point')是为了告诉编译器不要去除这个未引用的方法。  @pragma('vm:entry-point') // ignore: unused_element void _beginFrame(int microseconds) {   // 调用window.onBeginFrame方法   _invoke1<Duration>(window.onBeginFrame, window._onBeginFrameZone, Duration(microseconds: microseconds)); }  @pragma('vm:entry-point') // ignore: unused_element void _drawFrame() {   // 调用window.onDrawFrame方法   _invoke(window.onDrawFrame, window._onDrawFrameZone); } 

从Window.onBeginFrame和Window.onDrawFrame方法开始就触发了Flutter Dart层的帧绘制逻辑, 主要包含以下一些步骤:

Flutter 核心原理:Flutter帧渲染的整体流程

可以看到这里会通过我们熟悉的Widget Tree和Element Tree生成绘制树RenderObject Tree。RenderObject Tree会再进行Layout布局和Paint渲染等步骤。这里的Paint渲染并不是真正的渲染而是为了生成Layer TreeLayer Tree主要用来存储渲染相关的指令和参数,每个RenderObject绘制时,会把相关的绘制指令和绘制参数,存储在对应的Layer上

根据以下示例代码可以看到TextureBox的paint方法定义了自身的Layer(TextureLayer)记录了绘制信息,并且添加到Layer Tree中:

   //TextureBox部分源码 class TextureBox extends RenderBox {    ...   @override   void paint(PaintingContext context, Offset offset) {     if (_textureId == null)       return;     context.addLayer(TextureLayer(       rect: Rect.fromLTWH(offset.dx, offset.dy, size.width, size.height),       textureId: _textureId,     ));   }    ... } 

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » Flutter 核心原理:Flutter帧渲染的整体流程求职学习资料
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们