目前 Flutter 社区的发展已经很庞大,官方统计在过去的一年里,数据上 Flutter 已经基本超过超过其他跨平台框架,成为最受欢迎的移动端跨平台开发工具,截至 2022 年 2 月,有近 50 万个应用程序使用 Flutter。国外&国内很多大厂,个人开发者,社区都投入进来,但由于fullter天生的动态性较差,包大小和一些航母级app的历史包袱等问题,目前国内的发展方向主要是To B业务或者以flutter插件的混合开发的探索。
从最近Flutter的更新步伐也看出,整体降速,稳中提质和完善能力的战略。比如flutter 2.0基本是对web能力的补足,包括一些体验的提升,支持多引擎等。Flutter的2022年目标还是提升用户月活,让自己的社区生态更加繁荣,以应对其他跨端平台的冲击。
2022 RoadMap简介
时间来到了2022年,flutter最新的战略图是围绕桌面,web,开发和交互体验,engine支持多窗口等点打磨自身能力,其中笔者最关注的是flutter为了解决渲染jank的问题的新思路--重构着色器,也就是今天的主题。关于着色器编译Jank问题,官方经过多次尝试依然无法彻底解决,因此在2022年中明确提出要重新考虑使用着色器的方式,计划重写图像渲染后端。
前面一文中我们对现有Flutter绘制引擎Skia进行了剖析,今天我们来认识下未来的新渲染器Impeller,该渲染器从目前看还是个雏形,仅实现了metal后端,支持iOS和Mac系统,flutter计划2022年在iOS上将 Flutter 迁移到新架构上,然后根据经验将该解决方案移植到其他平台上。该渲染器相当于对skia 的gpu模块进行了重写,未来是否替换flutter下的skia,还是共存未可知,笔者更倾向于融合进skia里,毕竟跨平台本身兼容性成本大,难度高。
Flutter jank
Flutter过去一年多的时间解决了很多Jank问题,但compile shader导致的Jank问题一直没有彻底解决。问题源于Flutter底层使用了skia做为2D图形渲染库,而skia内部定义了一套SkSL(Skia shading language),SkSL 属于 GLSL 变体。在光栅化阶段,第一次使用着色器时Skia会根据绘图命令和设备参数生成 SkSL,然后再将 SkSL 转换为特定后端(GLSL、GLSL ES 或 Metal SL)着色器,并在设备上编译为着色器程序。而compile shader可能花费几百毫秒,导致数十帧的jank。flutter经历了多次的尝试解决,在加了slkl预热后,benchmark效果明显,但仍然无法彻底解决问题。
Impeller
Impeller是为flutter量身定做的渲染器,目前=仅实现了metal后端。其依赖了 flutter fml 和 display list,并实现了display list dispatcher 接口,可方便的替换skia。Impeller的核心目标:
性能提升
编译时离线编译所有着色器,并根据着色器预先构建 pipeline state objects。且支持多线程上分发单帧工作负载。
方便移植
虽大量使用底层图形库的API(如Metal和Vulkan)的特性,但是不依赖,不捆绑
impeller大致分为Compiler、Renderer,Entity、Aiks以及基础库Geomety和Base等几个模块。impeller compiler模块是解决着色器编译Jank的关键所在,包含Compiler?和?Reflector。离线编译开始着色器的第一阶段,利用impellerc compiler?把//impeller/entity/shaders/目录下所有着色器源码(包括顶点着色器和片段着色)编译为着色器中间语言?SPIR-V。第二个阶段,将SPIR-V 转换为底层特定的着色器语言(如Metal SL),随后编译为?shader library。同时利用impellerc reflector处理SPIR-V生成?C++ shader binding,用于在运行时快速创建pipeline state objecs(PSO),从而避免编译着色器导致的jank问题,其他细节和原理后续再表。读者也可以从?#85737?上了解其相关进展。
?
|