整体框架
Flutter 框架是一个分层的构造,每个层都建设在前一层之上。
最上层 embedder,提供五个 thread,将引擎移植到平台的中间层代码 渲染设置,原生插件,打包,线程治理,事件循环交互操作。
次要对应 engine 外面 shell 相干模块,common 是对外的对立接口,gpu 是 gpu 相干的对立接口,platform 上面的对应的不同平台的撑持,分辨是哦 android,darwin,embedder,fuchsia,glfw,linux,windows,common。其次是 profiling,性能调优方面的反对。
engine/embedder 层的架构
创立四个线程 并把以后线程设置 platform thread
- 在 GPUThread 创立 rasterizer
- 在 platform thread(APP 主线程)创立 PlatformView 并获取其 VSyncWaiter 传递给 Engine
- 创立 IO manager 在 IO 线程上
-
创立 engine 在 UI 线程上
实际上就是创立上面这四个
std::unique_ptr<Shell> Shell::CreateShellOnPlatformThread if (!shell->Setup(std::move(platform_view), // engine_future.get(), // rasterizer_future.get(), // io_manager_future.get()) // )
Platform Task Runner
依据代码在初始化 Engine 的时候,将以后线程设置为 PlatformTaskRunner 的 Thread,是 Flutter 和 Native 交互的桥梁,而且官网要求所有和 Flutter 的交互必须产生在 PlatformThread 中。
android app 过程所有的音讯都是通过 Platform Task Runner 来承受解决
以 android 为例子,platform_view_android 模块就是 Flutter 嵌入的 Java 代码和 Flutter 的 C / C ++ 代码之间的接口,ui 相干就跑在 RasterTaskRunner 中,实际上就是 GPU task runner 中,和原生零碎相干就跑在 platformTaskRunner
UI task runner
Engine 执行 Dart root isolate 代码,将其转换为 layer tree 视图构造。这个线程的过载会间接导致卡顿掉帧。
GPU task runner
GPU Task Runner 中的模块负责将 Layer Tree 提供的信息转化为理论的 GPU 指令。
GPU Task Runner 同时也负责配置管理每一帧绘制所须要的 GPU 资源,这包含平台 Framebuffer 的创立,Surface 生命周期治理,保障 Texture 和 Buffers 在绘制的时候是可用的。
GPU Runner 的过载会导致 Flutter 利用的卡顿。
用户不能向 GPU task runner 提交工作。
IO Task Runner
次要性能是从图片存储中读取压缩的图片格式,将图片数据进行解决为 GPU Runner 的渲染做好筹备。
总体来说
Platform Thread | GPU Thread | UI Thread | IO Thread |
---|---|---|---|
Flutter Engine 的接口 | 向 GPU 推送执行的指令 | 执行 Dart root isolate 代码 | io 相干读取 |