Flutter绘制原理与Flutter基本框架
发布网友
发布时间:2天前
我来回答
共1个回答
热心网友
时间:2024-10-04 06:49
关于图像的显示
不管是手机、电脑还是电视,我们在屏幕上可以看到的所有内容都是计算机绘制出来的图像。把相关图片连续播放就会产生动画效果,比如下面的小黄鸭的动画效果
将这个小黄鸭的动画拆解出来,其实就是很多张图片
关于图片显示的整个过程有俩个相关概念
帧率(fps):每秒钟显示多少帧,也可以理解为每秒钟显示多少画面
刷新率:显示器在一秒内刷新的次数,比如iPhone的刷新频率是60Hz,每秒刷新60次
帧率和刷新率的关系
在计算机中,CPU、GPU和显示器以一种特定的方式协作
将数据传递给CPU,CPU进行处理
CPU将处理好的显示内容提交给GPU
GPU渲染后放入帧缓冲区
视频控制器按照VSync信号从帧缓冲区取出帧数据传递给显示器显示
想要了解VSync信号原理可以看这篇文章AndroidVsync原理简析
Flutter绘制原理
Android、iOS、Flutter的UI渲染过程都一样,在整个Flutter架构中,Flutter只关心向GPU提供显示数据,不用关心显示屏、视频控制器以及GPU是如何工作的
绘制流程
GPU收到VSync信号后通知UI线程
UI线程用Dart来构建图层树
图层树在GPU线程进行合成
合成后的视图数据提供给Skia引擎
Skia引擎通过OpenGL或者Vulkan将显示内容提供给GPU
关于Skia引擎
Skia(SkiaGraphicsLibrary)是一个由C++编写的开源图形库
在Flutter中,Skia就是向GPU提供数据的途径
Skia目前是Android官方的图像渲染引擎,因此,FlutterAndroidSDK无需内嵌Skia引擎就可以获得Skia支持
对于iOS来说,由于Skia是跨平台的,它作为FlutteriOS的渲染引擎被嵌入到Flutter的iOSSDK中,替代了iOS平台本身的CoreGraphics/CoreAnimation/CoreText,所以,FlutteriOS打包成api时体积会比Android大一些
由于Android和iOS底层都是使用Skia引擎,所以底层渲染能力统一了,上层开发接口及功能体验也保持了一致
Flutter和ReactNative的本质区别
ReactNative之类的框架,只是通过JavaScript虚拟机扩展调用系统组件,最终由Android和iOS系统进行组件渲染
Flutter是自己完成了组件渲染的闭环
Flutter基本框架
Flutter框架分为三层:Framework、Engin、Embedder
Framework
FlutterFramework是一个纯Dart实现的SDK。它实现了一套基础库,用于处理动画、绘图和手势。并且基于绘图封装了一套UI组件库,然后根据Material(Android风格)和Cupertino(iOS风格)两种视觉风格区分开来。这个纯Dart实现的SDK被封装为了一个叫作dart:ui的Dart库。我们在使用Flutter写App的时候,直接导入这个库即可使用组件等功能。
Engin
FlutterEngine是一个纯C++实现的SDK。囊括了Skia引擎、Dart运行时、文字排版引擎等。它是Dart的一个运行时,它可以以JIT、JITSnapshot或者AOT的模式运行Dart代码。这个运行时还控制着VSync信号的传递、GPU数据的填充等,并且还负责把客户端的事件传递到运行时中的代码
Embedder
是一个嵌入层,即把Flutter嵌入到各个平台上去,这里做的主要工作包括渲染Surface设置,线程设置,以及插件等。这里可以看出,Flutter的平台相关层很低,平台只是提供一个画布,剩余的所有渲染相关的逻辑都在Flutter内部,这就使得它具有了很好的跨端一致性
原文:https://juejin.cn/post/7103762668808306724
Flutter绘制原理与Flutter基本框架
Flutter是自己完成了组件渲染的闭环 Flutter基本框架 Flutter框架分为三层:Framework、Engin、Embedder Framework FlutterFramework是一个纯Dart实现的SDK。它实现了一套基础库,用于处理动画、绘图和手势。并且基于绘图封装了一套UI组件库,然后根据Material(Android风格)和Cupertino(iOS风格)两种视觉风格区分开来。
三、Flutter的渲染机制之RenderObjectWidget、RenderObjectElement...
RenderObjectWidget 是 Widget 例如 SizeBox , Column 等 RenderObjectElement 是这类 Widget 生成的 Element 类型, 例如 SizeBox 对应 SingleChildRenderObjectElement (单子节点的 Element )RenderObject 才是真正负责绘制的对象,其中包含了 paint , layout 等方法~Text 组件为例: class Text exte...
Flutter系列文章-Flutter环境搭建和Dart基础
1. 下载Flutter SDK并解压至指定路径,注意不要将flutter安装到高权限路径。2. 设置环境变量,将Flutter的bin目录添加到PATH中。3. 选择IDE,推荐使用VS Code或Android Studio,安装Flutter和Dart插件。4. 运行flutter run命令,创建并运行第一个Flutter项目。5. 遇到问题时,使用“flutter doctor”检查并...
FlutterUI渲染原理概览
在Flutter中Widget是核心,一切都是Widget,但一起协同工作的还有另外两个元素:Element和RenderObject。由于它们都是有着树形结构,所以经常会称它们为三棵树。Widget 在开发Flutter应用过程中,接触最多的无疑就是Widget,是『描述』FlutterUI的基本单元。Flutter在widgets层中使用了相同的概念(一个Widget)来表示屏幕上的绘制...
Flutter入门——页面布局
在Flutter中,Flex布局是一种灵活的布局方式,可以帮助我们创建响应式和动态布局。Flex布局通过`Column`和`Row`组件来实现,它们可以根据主轴和交叉轴的属性进行布局调整。主轴决定了组件的排列方向,交叉轴则垂直于主轴,决定组件在垂直方向上的排列。`Column`和`Row`组件提供了多种对齐方式,如`mainAxis...
Flutter必备 | Flex布局完全解读
在Flutter布局体系中,Flex、Row和Column是核心组件,它们位于widgets包的基本文件中,共同构成了多子组件布局的基础。Flex布局提供了一系列属性,包括轴向、主轴方向、交叉轴方向、主轴尺寸、文字方向、竖直方向排序、基线对齐方式,以及与Flexible组件的配合。通过这些属性,开发者可以灵活地控制组件的排列方式,...
FlutterWidget原理解读(一)
暂时可以简单的理解,FLutter最终绘制在设备上的显示元素,都是通过Widget配置出来的。 在web前端开发中,我们知道浏览器页面由HTML+CSS+JS配置而成,其中HTML负责配置UI结构,CSS负责配置UI样式,JS负责UI的交互。 而在Flutter中,无论是UI结构,还是UI样式,再到UI交互都是通过Widget完成。例如: Widget树结构配置UI结构 ...
Flutter面试:渲染原理
二)绘制 布局完成后,渲染对象树中的每个节点都有了明确的尺寸和位置。Flutter会把所有的渲染对象绘制到不同的图层上。与布局过程一样,绘制过程也是深度优先遍历,而且总是先绘制自身,再绘制子节点。以下图为例:节点1在绘制完自身后,会再绘制节点2,然后绘制它的子节点3、4和5,最后绘制节点6。可...
Flutter Canvas学习之绘图篇
绘制圆角矩形:drawRRect drawRRect方法用于绘制带圆角的矩形,其绘制位置原理与Rect类似,但多了一个设置圆角的参数。绘制圆:drawOval drawOval方法用于绘制圆形,它是在Rect中进行的绘制。绘制圆弧:drawArc drawArc方法用于绘制圆弧,其中useCenter参数表示是否绘制中心点到圆弧两边。绘制路径:drawPath draw...
Flutter UI系统
为了在绘制控件等固定样式的图形时提供更直观、更方便的接口,Flutter 还基于这些基础能力,根据 Material 和 Cupertino 两种视觉设计风格封装了一套 UI 组件库。通过 Flutter API,开发者可以直接使用这些组件库,实现多端高度一致的渲染体验且性能接近原生。在了解 Flutter UI系统和操作系统交互的原理之后,...