Java&Android日更补完计划Android开发经验谈Android开发

关于Flutter你要知道的可能都在这里

2019-07-16  本文已影响22人  埃赛尔

开局一张图:

image.png

先从一张架构预览图说起吧:
Flutter架构分Framework/Engine/Embedder三层
Framework主要提供API的支持和不在本次讲述的范围之内,主要是综合闲鱼技术,美团技术,Flutter.io的一些文章以此管中窥豹对Flutter有个整体的认识,文中错误和理解偏差欢迎大佬指正
主要是对Embedder与Engine,DartVM,GPU之间交互,Embedder如何工作认识图如下:

image.png

Embedder是将Engine移植到平台的中间层代码

Embedder有四个类型的Runner
Engine和这四个Runner的关系是:

Embedder为每个Engine实例的UI,GPU和IO任务运行程序创建专用线程。所有引擎实例共享相同的Platform Thread和Platform Task Runner

问题1:FlutterEngine什么时候会创建实例?一个APP中会存在多个实例么?

带着问题先把Embedder了解完

PlatformRunner:

一个对Engine的Facad,主线程主要负责Engine和UITaskRunner之间的消息传递,但是官方要求所有与FlutterEngine的交互需要发生在PlatformRunnerThread中
PlatformRunnerThread:PlatformThread又是什么?Engine创建的时候都会创建一个线程用供PlatformRunner使用
因此我们可以得出结论
Engine和Embedder交互在PlatformThread中完成而且只和PlatformRunner交互

UITaskRunner:

创建Engine的时候会开辟一个子线程运行UITaskRunner,在这个线程中会创建DartVM同时DartVM创建DartRootisolate
Dart的isloate是自己管理的所以外部线程无法直接访问:
因此Engine的UI渲染任务通过PlatformRunner提交给UITaskRunner,UITaskRunner与DartVM交互(UITaskRunner告诉isolate开始构建layerTree,isolate将构建好的layerTree返回给UITaskRunner)

问题2:同线程内 UITask如何同DartVM的isolate 通信?

GPUTaskRunner:

创建Engine的时候同时会开辟一个子线程运行GPUTaskRunner,此时该Thread应该叫GPUThread,在GPU Task Runner将Layer Tree提供的信息转化为平台可执行的GPU指令。
GPU Runner会根据目前帧执行的进度去向UI Task Runner要求(VSync)下一帧的数据,在任务繁重的时候可能会告诉UI Task Runner延迟任务。

结合UITaskRunner和GPUTaskRunner附上下图:

image.png
在GPUThreadRunner中将LayerTree合并成视图数据并交给Skia加工成GPU数据这些数据最终会通过OpenGL最终提供给GPU渲染
问题3:LayerTree是构建生成的?

因此可以看到Flutter关注如何在两次VSync信号之间计算并合并成视图数据交给GPU渲染

IOTaskRunner:

1)主要功能是从图片存储(比如磁盘)中读取压缩的图片格式,将图片数据进行处理为GPU Runner的渲染做好准备。IO Runner首先要读取压缩的图片二进制数据(比如PNG,JPEG),将其解压转换成GPU能够处理的格式然后将数据上传到GPU。
2)加载其他资源文件

上一篇 下一篇

猜你喜欢

热点阅读