Flutter 之窥探 原理篇

Framework 层全部使用Dart 编写,它实现了一套基础库,用于处理动画、绘图和手势,并且封装了一套UI组件库,并预写了Android(MaterialDesign)和 iOS的(Cupertino)风格的UI,这个纯Dart实现的SDK被封装为了一个叫作dart:ui的Dart库,极大方便了开发移动端。从以上图中看,Flutter主要分为:两层 Framework 、Flutter Engine和Embedder
Flutter Engine是Flutter引擎,引擎主要负责图形绘制(Skia)、文字排版(libtxt)和提供Dart运行时,引擎全部使用C++ 实现,它是dart的一个运行时,它可以以JIT、JIT Snapshot或者AOT的模式运行Dart代码
Embedder是一个潜入层,即把Flutter嵌入到各个平台上去,这里做的主要工作包括渲染Surface设置,线程设置以及插件等
一个完整的Flutter 项目架构图:
Dart 对于UI框架的高性能支持
Flutter的Framework层是使用了Dart语言编写,那Dart语言工具有哪些优势呢?
Dart内存分配机制
DartVM的内存分配策略非常简单,创建对象时只需要在现有堆上移动指针,内存增城始终是线形的,省去了查找可用内存分段的过程如下图

Dart 支持两种编译模式
1:JIT编译 Just In Time Compile - 即时编译、实时编译
2:AOT 编译Ahead Of Time 预编译,静态编译
在debug模式下使用JIT编译,生成script、bytecode 进行解析执行,可用支持HotReload(热重载),修改代码,保存即可在设备上看到效果,在release 下,AOT编译生成Machine Code,高效的运行
Dart 单线程异步消息机制
Flutter采用的Dart这种单线程机制,省去了多线程上下文切换带来的性能损耗(对于高消耗,也同样支持多线程操作,通过Isolate开启,这里的多线程,内存是无法共享的)
Dart 异步消息原理
当一个Dart的方法开始执行时,他会一直执行直至达到这个方法的退出点,换句话说Dart的方法是不会其它dart 点打断的,当一个Dart应用开始的标志是它的main isolate(隔离) 执行了main 方法,当main 方法退出后,main isolate 的线程
开发效率高
Dart运行时和编译器支持Flutter的两个关键特性的组合,分别是基于JIT的快速开发周期和基于AOT的发布包。基于JIT的快速开发周期:Flutter在开发阶段,采用JIT模式,这样就避免了每次改动都需要进行编译,极大地节省了开发时间。基于AOT的发布包,Flutter在发布时可以通过AOT生成高效的ARM代码,以保证应用性能。而JavaScript则不具备这个能力。
高性能
为了实现流畅、高保真的的UI体验,Flutter必须在每个动画帧中都运行大量的代码。这意味着需要一种既能支持高性能,又能保证不丢帧的周期性暂停的语言,而Dart支持AOT,在这一点上比JavaScript更有优势。
快速分配内存
Flutter框架使用函数式流,
这使得它在很大程度上依赖于底层的内存分配器。
类型安全
由于Dart是类型安全的语言,支持静态类型检测,所以可以在编译前就发现一些类型的错误,并排除潜在问题。这对于前端开发者来说更具有吸引力。
综合上部信息我们了解到Dart语言的优势,Flutter 的整体结构, 下面分析下运行时的一些原理:
绘图基本原理

上图是屏幕显示图像的基本原理的图,从上图我们可以看出,Cpu Gpu和显示器以一种特定的方式协作:CPU将计算号的显示内容提交给GPU,GPU渲染后放入帧混冲区(FrameBuffer),然后试图控制器按照VSync 信号从帧缓冲区取出数据传递给显示器,这样一个大致流程。当然Flutter也不例外,如下图

Flutter只关心向 GPU提供视图数据,GPU的 VSync信号同步到 UI线程,UI线程使用 Dart来构建抽象的视图结构,这份数据结构在 GPU线程进行图层合成,视图数据提供给 Skia引擎渲染为 GPU数据,这些数据通过 OpenGL或者 Vulkan提供给 GPU。
总结,从整体结构看,只要有任何语言的编程基础,基本可以开发Flutter 应用程序,但是从原理上,针对每个模块的仔细研究还是需要仔细去研究的。
下期从Flutter 启动流程分析Flutter 项目。。。。