基于Flutter的Canvas探索与应用

简介: 目前在小程序互动场景下遇到的业务痛点,并且给出了基于Flutter引擎的解法。基于Flutter引擎,对外提供标准的Web Canvas API和并利用flutter渲染管线,让业务代码在小程序worker线程中直接渲染,缩短了渲染链路,提高了渲染性能。本次分享将由淘宝技术部无线开发专家万红波为大家分享目前在小程序互动场景下遇到的业务痛点,以及基于Flutter引擎的解法。

目前在小程序互动场景下遇到的业务痛点,并且给出了基于Flutter引擎的解法。基于Flutter引擎,对外提供标准的Web Canvas API和并利用flutter渲染管线,让业务代码在小程序worker线程中直接渲染,缩短了渲染链路,提高了渲染性能。本次分享将由淘宝技术部无线开发专家万红波为大家分享目前在小程序互动场景下遇到的业务痛点,以及基于Flutter引擎的解法。

演讲嘉宾简介:万红波,花名远湖,淘宝技术部无线开发专家。主要从事浏览器内核以及渲染引擎方向的研究。目前在AliFlutter团队主要负责底层引擎以及Canvaa相关研究于应用。

以下内容根据演讲视频以及PPT整理而成。
观看回放
本次分享主要围绕以下六个方面:

业务背景  
业务痛点  
解决方案  
技术改造  
业务效果  
未来规划  

一、业务背景

屏幕快照 2020-06-22 下午4.20.35.png

小程序作为一个商业化解决方案,这几年发展迅速,在头部APP中占据重要位置,与传统H5同,渲染和逻辑分离到各自独立线程,可以做到并行化。Worker和Render之间通过PostMessage或者SetData来通信。

二、业务痛点

屏幕快照 2020-06-22 下午4.21.08.png

小程序的架构可以满足大部分场景,但在互动场景下,业务通常使用Canvas API进行每帧的绘制,每一帧通常包含大量的绘制操作,worker和render之间通信频繁,渲染性能大幅度降低,用户体验较差。其中耗时较大的点在数据的多次序列化和反序列化且多次通过JNI来实现Java和C++的数据传递。在微信小程序和支付宝小程序文档中,提供了一些最佳实践来减低影响,比如PostMessage或者SetData的接口,一秒内调用不可超过20次,且对SetData的数据大小有所限制。但对于互动业务来说,要求每秒FPS的帧率,且每帧都需要大量的绘制指令需要传递,则很难通过这种方式解决。

三、解决方案

屏幕快照 2020-06-22 下午4.29.37.png

我们的解决方案是在小程序worker环境中直接对接渲染引擎,缩短渲染了链路,减少通信损耗,提高渲染性能。Worker中对接独立的2D渲染引擎,不再通过render和worker传递消息。而其他的页面,由于通信并不频繁,仍使用原来的链路渲染。

屏幕快照 2020-06-22 下午4.29.54.png

我们选择了Flutter引擎作为独立的渲染引擎。我们选择Flutter的原因:
1、跨平台的特性,客户端包含安卓和IOS,忽略客户端细节,仅完成渲染,而Flutter引擎可以很好的屏蔽客户端细节;
2、高性能,和传统的H5渲染引擎相比,是一个轻量型的多线程2D引擎;
3、Flutter内部使用Skia作为渲染引擎,其兼容性、性能和适配性已在生产环境中被多次检验,安全稳定。

屏幕快照 2020-06-22 下午4.30.16.png

Flutter渲染管线较短,平台层发出vsync信号,丢到Platform task,调用UI线程已注册的callback,即Animator的BeginFrame函数,其将调用window的BeginFrame函数,window对象在Flutter中较为特殊,其连接上层Framework和下层Flutter engine。图中绿色的区域即为Dart需要完成的事情,当BeginFrame进入Dart层之后,dart层调用Render的DrawFrame函数,做layout和paint,paint过程中图片相关的部分会传递给IO线程抑或请求图片解码,同时在GPU线程上传纹理。上述完成后,调用RenderFrame函数,实现上屏。其中Dart层的绘制指令被组织为Layer Tree这种数据结构,它后续被传递给GPU Task,GPU Task读取Layer Tree中的渲染指令,直接光栅化,之后上屏。RenderFrame做下一次的vsync请求

屏幕快照 2020-06-22 下午4.30.33.png

最终方案:面向业务,提供标准的Web Canvas API,业务感知不到下层引擎变化;通过业务容器引入JS引擎,并把C++实现的Canvas API通过binging方式,注入到小程序worker线程;引入Canvas渲染管线,和原生dart模式共存,提高性能和内存使用率,业务可灵活切换。

四、技术改造

屏幕快照 2020-06-22 下午4.34.53.png

方案对渲染流水线有较大的改造,原先platform线程接收到vsync之后,将其传递给UI线程,UI线程在Dart层做绘制操作。而改造后在小程序环境中,用JS逻辑代替Dart层,业务逻辑在worker线程中完成,vsync被传递给JS线程,JS线程收到vsync后,驱动业务执行JS代码,进行绘制并生成渲染指令生成后依然生成layer tree,传递给GPU线程,光栅化完成后上屏。

屏幕快照 2020-06-22 下午4.35.30.png

改造后的渲染管线,与改造前不同的是:platform线程收到vsync信号后,不再调用原先的callback,而是调用我们自己注册的自定义callback,即OnVsync,将Vsync传递给JS线程。JS线程主要执行requestAnimationFrame的callback,对屏幕进行绘制更新,JS线程执行完成后,调用FlushFrame,将layer tree传递给GPU线程,直接光栅化后上屏。绘制结束后,通过Animator的RequestFrame函数请求下一次vsync。

图片加载流程改造,原先的图片加载流程并不适用小程序环境下,JS线程中的资源请求被丢给平台的手淘图片库,完成图片的下载和解码,解码后的数据传递给IO线程。IO线程生成GPU纹理,并将其缓存在Flutter engine中。业务直接使用引擎中已经生成纹理的图片,可直接上屏。

五、业务效果

安卓低端机上,业务改造前FPS为15,改造后42,效果明显。FPS数据由于测试业务没有通过Vsync来驱动绘制,而是直接使用timer来驱动,使得CPU占用率较高,且改造后FPS提高很大。线下测试中,采用Vsync驱动绘制,改造后的FPS提高30%左右。

目前我们还支持Lottie动画,设计师可以通过Lottie动画设计画面效果。并且支持白鹭游戏引擎。

六、未来规划

未来规划有三个方向,首先接入更多三方游戏引擎,和三方游戏引擎深度合作,其次探索高阶渲染API的实现。支持WebGL API。第三探索独立小游戏容器,能够基于已完成的方案做更多的尝试。

关注「淘系技术」微信公众号,一个有温度有内容的技术社区~

image.png

相关实践学习
基于阿里云DeepGPU实例,用AI画唯美国风少女
本实验基于阿里云DeepGPU实例,使用aiacctorch加速stable-diffusion-webui,用AI画唯美国风少女,可提升性能至高至原性能的2.6倍。
相关文章
|
2月前
|
缓存 监控 前端开发
【Flutter 前端技术开发专栏】Flutter 应用的启动优化策略
【4月更文挑战第30天】本文探讨了Flutter应用启动优化策略,包括理解启动过程、资源加载优化、减少初始化工作、界面布局简化、异步初始化、预加载关键数据、性能监控分析以及案例和未来优化方向。通过这些方法,可以缩短启动时间,提升用户体验。使用Flutter DevTools等工具可助于识别和解决性能瓶颈,实现持续优化。
【Flutter 前端技术开发专栏】Flutter 应用的启动优化策略
|
2月前
|
Dart 前端开发 开发工具
【Flutter前端技术开发专栏】Flutter入门指南:搭建开发环境与第一个应用
【4月更文挑战第30天】本文介绍了Flutter SDK的安装和配置过程,以及如何创建并运行第一个Flutter应用。首先确保安装了Dart SDK和Flutter SDK,支持macOS、Linux和Windows。安装完成后,设置环境变量,然后通过`flutter doctor`验证安装。接着,使用`flutter create`命令创建新项目,进入项目目录并运行`flutter run`启动应用。在`main.dart`中修改代码以自定义应用。Flutter支持热重载和DevTools调试。本文为Flutter初学者提供了快速入门的指导。
【Flutter前端技术开发专栏】Flutter入门指南:搭建开发环境与第一个应用
|
4天前
|
监控 Serverless 持续交付
阿里云云效产品使用问题之如何让流水线支持构建 flutter web 应用到 OSS
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
10天前
|
缓存 视频直播
flutter3-dylive 基于flutter3.19+getx短视频/直播应用
基于跨端技术flutter3.19+dart3+getx实战短视频/直播应用项目。
24 4
|
21天前
|
Dart 监控 开发者
详细介绍Flutter Profiler的功能、使用方法以及如何利用它来提升应用的性能
【6月更文挑战第11天】Flutter Profiler是用于优化Flutter应用的关键工具,提供CPU、GPU、内存和网络分析。它帮助开发者监控运行时性能,识别瓶颈,如CPU过度使用、渲染问题、内存泄漏和网络效率低。通过选择分析类型、开始分析、查看结果,开发者可进行针对性优化。最佳实践包括定期分析、结合实际场景、关注关键指标及结合其他工具。有效利用Profiler能提升应用性能和用户体验。
40 2
|
21天前
|
开发框架 Dart JavaScript
深入探讨Flutter中的Web支持功能,以及如何利用Flutter构建跨平台Web应用的最佳实践
【6月更文挑战第11天】Flutter,Google的开源跨平台框架,已延伸至Web支持,让开发者能用同一代码库构建移动和Web应用。Flutter Web基于Dart转JavaScript,利用WebAssembly和JavaScript在Web上运行。构建Web应用最佳实践包括选择合适项目、优化性能、进行兼容性测试和利用Flutter的声明式UI、热重载等优势。尽管性能挑战存在,Flutter Web为跨平台开发提供了更多机会和潜力。
41 1
|
2月前
|
缓存 监控 前端开发
【Flutter前端技术开发专栏】Flutter应用的性能调优与测试
【4月更文挑战第30天】本文探讨了Flutter应用的性能调优策略和测试方法。性能调优对提升用户体验、降低能耗和增强稳定性至关重要。优化布局(避免复杂嵌套,使用`const`构造函数)、管理内存、优化动画、实现懒加载和按需加载,以及利用Flutter的性能工具(如DevTools)都是有效的调优手段。性能测试包括基准测试、性能分析、压力测试和电池效率测试。文中还以ListView为例,展示了如何实践这些优化技巧。持续的性能调优是提升Flutter应用质量的关键。
【Flutter前端技术开发专栏】Flutter应用的性能调优与测试
|
2月前
|
前端开发 Android开发 开发者
【Flutter前端技术开发专栏】Flutter中的混合应用(Hybrid Apps)开发
【4月更文挑战第30天】本文探讨了使用Flutter开发混合应用的方法。混合应用结合Web技术和原生容器,提供快速开发和低成本维护。Flutter,一款现代前端框架,以其插件系统和高性能渲染引擎支持混合应用开发。通过创建Flutter项目、添加平台代码、使用WebView、处理平台间通信以及发布应用,开发者可构建跨平台混合应用。虽然混合应用有性能和用户体验的局限,但Flutter的跨平台兼容性和丰富的插件生态降低了开发成本。开发者应根据项目需求权衡选择。
【Flutter前端技术开发专栏】Flutter中的混合应用(Hybrid Apps)开发
|
2月前
|
开发框架 Dart 前端开发
【Flutter前端技术开发专栏】Flutter中的Web支持:构建跨平台Web应用
【4月更文挑战第30天】Flutter,Google的开源跨平台框架,已延伸至Web领域,让开发者能用同一代码库构建移动和Web应用。Flutter Web通过将Dart代码编译成JavaScript和WASM运行在Web上。尽管性能可能不及原生Web应用,但适合交互性强、UI复杂的应用。开发者应关注性能优化、兼容性测试,并利用Flutter的声明式UI、热重载等优势。随着其发展,Flutter Web为跨平台开发带来更多潜力。
【Flutter前端技术开发专栏】Flutter中的Web支持:构建跨平台Web应用
|
2月前
|
前端开发 搜索推荐 UED
【Flutter前端技术开发专栏】Flutter中的高级UI组件应用
【4月更文挑战第30天】探索Flutter的高级UI组件,如`TabBar`、`Drawer`、`BottomSheet`,提升应用体验和美观度。使用高级组件能节省开发时间,提供内置交互逻辑和优秀视觉效果。示例代码展示了如何实现底部导航栏、侧边导航和底部弹出菜单。同时,自定义组件允许个性化设计和功能扩展,但也带来性能优化和维护挑战。参考Flutter官方文档和教程,深入学习并有效利用这些组件。
【Flutter前端技术开发专栏】Flutter中的高级UI组件应用