https://zhuanlan.zhihu.com/p/157333624
- Embedder 系统适配层,主要负责渲染surface设置,线程设置。
- Flutter Engine 纯 C++实现的 SDK,其中包括了 Skia引擎、Dart运行时、文字排版引擎等
- Flutter Framework 一个纯 Dart实现的 SDK,它实现了一套基础库。 Foundation和Animation、Painting、Gestures对应的是Flutter中的dart:ui包,它是Flutter引擎暴露的底层UI库,提供动画、手势及绘制能力 render层,抽象布局层(类似react 虚拟DOM) Widgets层是Flutter提供的的一套基础组件库,之上Flutter还提供了 Material 和Cupertino两种视觉风格的组件库。
在Flutter中,Widget的功能是“描述一个UI元素的配置数据”,它就是说,Widget其实并不是表示最终绘制在设备屏幕上的显示元素,而它只是描述显示元素的一个配置数据,另外需要注意的是Widget是不可变的,当配置发生变化时,会重建Widget。simple is fast。
Widget其实并不是表示最终绘制在设备屏幕上的显示元素,真正代表屏幕上显示元素的类是Element,它是 Widget 的实例化对象(如下图,Widget 提供了 createElement 工厂方法来创建 Element),持久存在于运行时的 Dart 上下文之中。它承载了构建的上下文数据,是连接结构化的配置信息到最终完成渲染的桥梁。Element 这一层将 Widget 树的变化做了抽象(类似 React / Vue 的 VDOM Diff),只将真正需要修改的部分同步到 RenderObject Tree 中,由此最大程度去降低重绘区域,提高渲染效率
渲染对象树。RenderObject 由 Element 创建并关联到 Element.renderObject 上 Flutter 采用深度优先机制遍历渲染对象树,确定树中各个对象的位置和尺寸,并把它们绘制到不同的图层上。绘制完毕后,合成和渲染的工作则交给 Skia 处理
Layer,它依附于 RenderObject(通过 RenderObject.layer 获取),是绘图操作的载体,也可以缓存绘图操作的结果。Flutter 分别在不用的图层上绘图,然后将这些缓存了绘图结果的图层按照规则进行叠加,得到最终的渲染结果
-
Web 容器方案(h5) Web 与 原生系统之间的通信,则通过 JSBridge 来完成,原生系统通过 JSBridge 接口暴露能力给 Web 调用。而页面的呈现,则由浏览器组件按照标准的浏览器渲染流程自行将 Web 加载、解析、渲染
-
泛 Web 容器方案(React Native,Weex,Hippy) 它放弃了浏览器渲染,而采用原生控件,从而保证交互体验; 直接调用原生控件虽然提升了体验和性能,但是 不同端相同的原生控件的渲染结果是存在差异的,跨端的差异需要巨大的工作量来抹平。 Bridge 的通信效率一般,在需要高频通信的场景下会造成丢帧
-
自绘引擎方案(Flutter) 其通过 Skia 图形库直接调用 OpenGL 渲染,保证渲染的高性能,同时抹平差异性。 开发语言选择同时支持 JIT 和 AOT 的 Dart ,保证开发效率的同时,较 JavaScript 而言,更是提升了数十倍的执行效率 Flutter 通过 Channel 进行通信,其中:
-
BasicMessageChannel,用于传递字符串和半结构化的信息,是全双工的,可以双向请求数据。
-
MethodChannel, 用于传递方法调用 ,即 Dart 侧可以调用原生侧的方法并通过 Result 接口回调结果数据。
-
EventChannel: 用户数据流的通信 ,即 Dart 侧监听原生侧的实时消息,一旦原生侧产生了数据,立即回调给 Dart 侧
参考文章:Flutter中文网
3.Pyston v2: 20% faster Python Pyston 是 Python 的基于 JIT 另一种实现,更快且高度兼容 CPython