前言
flutter 已经成功移植arm32位平台运行,方案是可行的,这里贴一下相关研究文档。移植操作后续再公布
flutter探索研究
opengl相关研究研究:
1. drm:drm是一种图形显示框架,支持vsync(同步信号,适用于fps大于刷新频率的情况),dma-buf(buffer共享,buf和file统一),异步更新,fence机制(cpu,gpu数据同步)。同时DRM可以统一管理GPU和Display驱动,使得软件架构更为统一,方便管理和维护。
2. drm驱动框架可以创建fb驱动框架的设备节点/dev/fb0,但是该节点不可操作(虚拟机中),因为映射的虚拟内存没有和显存物理页进行绑定(虚拟机中,fb框架采用defer io机制,实现上的问题导致异常.fb_deferred_io_page)
3. libdrm了解,只有操作系统支持drm驱动,才能使用libdrm。libdrm本质就是对drm驱动的使用的封装。
4. mesa了解,mesa是管理opengl实现的一个opengl框架,其内部支持opengl的软件实现以及各种gpu型号的硬件调用实现,还包括新型GPU标准vulkan。且必须依赖于libdrm(目前还没有成功去除对libdrm的依赖)
5. opengl相关库的基本了解:libgl是opengl接口的实现的封装(软件libopengl,还是哪款gpu的opengl实现,可能依赖于libdrm),libglu是对libgl接口的封装(集成libglu的接口),libglut是opengl的窗口实现(使用glut创建窗口, 使用gl和glu进行绘图,glut对接桌面
图形系统)
6. flutter-engine内置了swiftshader(opengl软件实现,以及硬件实现,类似mesa)
flutter-elinux-embeddered学习:
1. flutter-elinux是基于wayland,x11,glfw等窗口UI系统实现flutter显示的框架,其内部包含wayland,x11,glfw的flutter embeddered(嵌入器)的实现。flutter embeddered主要需要实现显示对接以及事件对接。
2 flutter-elinux将embedder的对接整理出一套框架,将变化的部分进一步隔离出来,区别实现,简化了flutter embeddered的对接。
2.1 flutter-elinux内置对glfw的支持,example的实现简单,但是内部机制无法深究
2.2 flutter-elinux内置对wayland的支持,需要依赖于libdrm,其支持vsync,可以探究其实现, 且有必要通过了解其机制探索flutter机制
2.3 flutter-elinux内置对x11的支持,需要依赖于libdrm,其支持vsync,可以探究其实现, 且有必要通过了解其机制探索flutter机制
2.4 x11中的xserver调用compositor(合成器,使用gpu)负责将xclient的layer合成到一起去显示,wayland认为xserver存在没有必要,去掉了xserver的存在,直接使用compositor,提高了性能,大概是未来主流的linux桌面图形系统。
flutter_engine源码了解:
1. flutter_engine内置swiftshader(opengl软件实现,以及硬件实现,类似mesa)
2. flutter_engine可以通过编译控制,控制要不要内置dart虚拟机(解释器),如果不内置dart解释器,需要以库的形式提供dart虚拟机支持。(暂未搞清楚dart三方库dart脚本是如何集成进flutter_engine.so的,需要了解)
3. flutter的渲染机制有四种方式可以选择,1. kOpengl 2. kSoftware 3. kMetal 4.kVulkan
3.1 kOpengl就是实现使用opengl渲染,flutter内置opengl软件实现(skia依赖),可以通过编译选项关闭opengl支持,裁剪flutter_engine.so。使用kOpengl模式可以有很多方式支持,目前能看到的参考用例大多数是kOpengl
3.2 kSoftware就是软件渲染,其内部是不是使用的swiftshader进行软件的opengl渲染有待研究,flutter会将绘制好的buffer通过surface_present_callback回调提供。window系统就是此方式进行对接。
3.3 kMetal就是是一种低层次的渲染应用程序编程接口,类似于opengl。百科:专为开发高临场感主机游戏的开发者打造,可让开发者全力发挥 A7 和 A8 芯片的性能。该技术经过优化,使处理器和图形处理器能够协同工作来实现最优性能。
3.4 kVulkan类似opengl,将来可能会淘汰Opengl,成为主流的GPU变成标准,同Opengl,swiftshader和mesa提供软件实现支持
4. flutter内部的playground仅支持kMetal和opengl,这个会不会影响到上层实现,有待研究
5. flutter_engine内部支持window窗口(FlutterWindowWin32),flutter渲染好以后,(kSoftware模式)通过surface_present_callback->FlutterWindowsView::PresentSoftwareBitmap->FlutterWindowWin32::OnBitmapSurfaceUpdated形式通知window进行重绘。
6. 可以通过嵌入器测试用例学习各种嵌入器的接入。engine\shell\platform\embedder\tests\embedder_config_builder.cc
flutter-elinux研究
1. 使用bundle资源路径构造flutter::DartProject对象
1.1 bundle资源路径下需要 /data/flutter_assets,/data/icudtl.dat,/lib/libapp.so
1.1.1 icudtl.dat 由FlutterTool提供,作为资源使用
1.1.2 flutter_assets 由FlutterTool构建
1.1.3 libapp.so 由FlutterTool构建,用于aot构建
1.2 DartProject是官方的类,构造中仅保存三个文件路径
2. 创建flutter::FlutterViewController::ViewProperties对象,填充宽高,旋转角度,是否有光标等参数
3. 使用flutter::FlutterViewController::ViewProperties对象和flutter::DartProject对象构建FlutterWindow对象
3.1 FlutterWindow对象应该就是自定义的
4. 调用FlutterWindow::OnCreate()方法启动引擎
4.1 使用flutter::FlutterViewController::ViewProperties对象
和flutter::DartProject对象构造flutter::FlutterViewController对象
4.1.1 构造中会使用flutter::DartProject对象构造flutter::FlutterEngine对象
4.1.1.1 构造中会从DartProject中取出argc,argv,以及三资源的路径初始化FlutterDesktopEngineProperties
4.1.1.2 构造中会使用FlutterDesktopEngineProperties构造FlutterProjectBundle对象
4.1.1.3 构造中会创建一个TaskRunner对象(用于执行任务), 运行时会检测engine是否为空,
不为空则会调用flutter API接口运行task(engine为FlutterEngine(添加符号是为了以后拓展),此时还未初始化)
task_runner_ = std::make_unique<TaskRunner>(
std::this_thread::get_id(), embedder_api_.GetCurrentTime,
[this](const auto* task) {
if (!engine_) {
ELINUX_LOG(ERROR)
<< "Cannot post an engine task when engine is not running.";
return;
}
if (embedder_api_.RunTask(engine_, task) != kSuccess) {
ELINUX_LOG(ERROR) << "Failed to post an engine task.";
}
});
4.1.1.3 构造中会使用FlutterProjectBundle对象构造FlutterELinuxEngine对象
4.1.1.3.1 构造中初始化FlutterEngineProc

本文深入探讨了Flutter在嵌入式设备上的移植过程,详细介绍了如何在ARM32平台上运行Flutter,并分析了Flutter Engine的内部机制。研究内容包括DRM框架、OpenGL、 mesa库、Flutter Engine的构建选项、SwiftShader以及Flutter Embedder for Linux的实现。此外,还讨论了Flutter在X11和Wayland窗口系统中的工作原理,以及如何通过Flutter Engine Proc Table和Task Runners管理任务。文章最后提到了Flutter-pi项目,这是一个轻量级的Flutter实现,专注于嵌入式平台。
最低0.47元/天 解锁文章
418

被折叠的 条评论
为什么被折叠?



