开局一张图:
image.png先从一张架构预览图说起吧:
Flutter架构分Framework/Engine/Embedder三层
Framework主要提供API的支持和不在本次讲述的范围之内,主要是综合闲鱼技术,美团技术,Flutter.io的一些文章以此管中窥豹对Flutter有个整体的认识,文中错误和理解偏差欢迎大佬指正
主要是对Embedder与Engine,DartVM,GPU之间交互,Embedder如何工作认识图如下:
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附上下图:
在GPUThreadRunner中将LayerTree合并成视图数据并交给Skia加工成GPU数据这些数据最终会通过OpenGL最终提供给GPU渲染
问题3:LayerTree是构建生成的?
因此可以看到Flutter关注如何在两次VSync信号之间计算并合并成视图数据交给GPU渲染
IOTaskRunner:
1)主要功能是从图片存储(比如磁盘)中读取压缩的图片格式,将图片数据进行处理为GPU Runner的渲染做好准备。IO Runner首先要读取压缩的图片二进制数据(比如PNG,JPEG),将其解压转换成GPU能够处理的格式然后将数据上传到GPU。
2)加载其他资源文件
网友评论