Flutter 高性能原理浅析
前言
Flutter 是 Google 推出的用于在 iOS 和 Android 平台开发高质量原生应用的全新移动 UI 框架。Flutter 的发展经历了几个重要版本节点:
- 2018 年 2 月 27 日,Google 发布了 Flutter 的第一个 Beta 版本。
- 2018 年 6 月 21 日,发布了第一个 Release Preview 1 版本。
- 2018 年 12 月 5 日,第一个 Release 1.0 版本正式发布。
此后,Flutter 逐渐受到广泛关注。在 Flutter 诞生之前,跨平台 UI 框架方案主要包括基于 WebView 的 Cordova、AppCan 等,以及使用 HTML+JavaScript 渲染成原生控件的 React Native、Weex 等。Flutter 开辟了一种全新的思路,从头到尾重写一套跨平台的 UI 框架,包括 UI 控件、渲染逻辑甚至开发语言。
Flutter 框架结构

从架构图中可以看出,Flutter 主要被分为两层:Framework 层和 Flutter Engine。
Framework 层
Framework 层全部使用 Dart 编写,提供完整的 UI 框架 API,并预写了 Android(Material Design)和 iOS(Cupertino)风格的 UI,极大方便了移动端开发。
Flutter Engine 层
Framework 底层是 Flutter 引擎。引擎主要负责图形绘制 (Skia)、文字排版 (libtxt) 和提供 Dart 运行时,引擎全部使用 C++ 实现。
Flutter 高性能原理
与其他跨平台框架对比
Hybrid 架构
Hybrid 架构的 UI 层渲染是基于 WebView 去渲染,其性能取决于 WebView 的渲染性能。目前已知 WebView 渲染性能 < Native UI 的性能。
RN/Weex 架构
RN/Weex 的架构中,是基于 Native 的 UI 框架去适配,中间多了一层 JS 转 Native UI 的过程,存在通信开销。
Flutter 架构
Flutter 不需要中间层(如 WebView 或 JS 转 Native UI 过程),它是基于图像渲染引擎去直接绘制 UI,减少了桥接损耗。
Dart 对于 UI 框架的高性能支持
Flutter 的 Framework 层使用了 Dart 语言,Dart 语言具有以下优势:
Dart 内存分配机制
DartVM 的内存分配策略非常简单,创建对象时只需要在现有堆上移动指针,内存增长始终是线性的,省去了查找可用内存段的过程。Dart 中类似线程的概念叫做 Isolate,每个 Isolate 之间是无法共享内存的,这种分配策略可以让 Dart 实现无锁的快速分配。
Dart 垃圾回收机制
Dart 的垃圾回收采用了多生代算法。新生代在回收内存时采用了'半空间'算法,触发垃圾回收时,Dart 会将当前半空间中的'活跃'对象拷贝到备用空间,然后整体释放当前空间的所有内存。整个过程中 Dart 只需要操作少量的'活跃'对象,大量的没有引用的'死亡'对象则被忽略。这种多生代无锁垃圾回收器,专门为 UI 框架中常见的大量 Widgets 对象创建和销毁优化,非常适合 Flutter 框架中大量 Widget 重建的场景。
Dart 编译模式优化
代码体积优化(Tree Shaking),编译时只保留运行时需要调用的代码(不允许反射这样的隐式引用),所以庞大的 Widgets 库不会造成发布体积过大。
Dart 支持两种编译模式:
- JIT 编译 (Just In Time Compiler - 即时编译):在 debug 模式下使用,生成 script/bytecode 进行解释执行,可以支持 HotReload(热重载),修改代码后保持即可在设备上看到效果。

