基于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

相关实践学习
部署Stable Diffusion玩转AI绘画(GPU云服务器)
本实验通过在ECS上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。
相关文章
|
3月前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
381 4
|
20天前
|
前端开发 安全 开发工具
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
159 90
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
3月前
|
缓存 监控 前端开发
优化 Flutter 应用启动速度的策略,涵盖理解启动过程、资源加载优化、减少初始化工作、界面布局优化、异步初始化、预加载关键数据、性能监控与分析等方面
本文探讨了优化 Flutter 应用启动速度的策略,涵盖理解启动过程、资源加载优化、减少初始化工作、界面布局优化、异步初始化、预加载关键数据、性能监控与分析等方面,并通过案例分析展示了具体措施和效果,强调了持续优化的重要性及未来优化方向。
122 10
|
25天前
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
160 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
23天前
|
Dart 前端开发 Android开发
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
47 4
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
3月前
|
存储 调度 数据安全/隐私保护
鸿蒙Flutter实战:13-鸿蒙应用打包上架流程
鸿蒙应用打包上架流程包括创建应用、打包签名和上传应用。首先,在AppGallery Connect中创建项目、APP ID和元服务。接着,使用Deveco进行手动签名,生成.p12和.csr文件,并在AppGallery Connect中上传CSR文件获取证书。最后,配置签名并打包生成.app文件,上传至应用市场。常见问题包括检查签名配置文件是否正确。参考资料:[应用/服务签名](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ide-signing-V5)。
124 3
鸿蒙Flutter实战:13-鸿蒙应用打包上架流程
|
3月前
|
传感器 前端开发 Android开发
在 Flutter 开发中,插件开发与集成至关重要,它能扩展应用功能,满足复杂业务需求
在 Flutter 开发中,插件开发与集成至关重要,它能扩展应用功能,满足复杂业务需求。本文深入探讨了插件开发的基本概念、流程、集成方法、常见类型及开发实例,如相机插件的开发步骤,同时强调了版本兼容性、性能优化等注意事项,并展望了插件开发的未来趋势。
79 2
|
4月前
|
移动开发 Dart 搜索推荐
打造个性化安卓应用:从零开始的Flutter之旅
【10月更文挑战第20天】本文将引导你开启Flutter开发之旅,通过简单易懂的语言和步骤,让你了解如何从零开始构建一个安卓应用。我们将一起探索Flutter的魅力,实现快速开发,并见证代码示例如何生动地转化为用户界面。无论你是编程新手还是希望扩展技能的开发者,这篇文章都将为你提供价值。
|
3月前
|
存储 Dart
Flutter&鸿蒙next 实现一个计算器应用
本文介绍了如何使用 Flutter 创建一个简单的计算器应用,包括基本的加减乘除运算。文章详细讲解了界面布局、计算逻辑和状态管理的实现步骤,通过具体的代码示例展示了如何构建计算器界面、处理用户输入和显示计算结果。
139 0
|
3月前
|
传感器 开发框架 物联网
鸿蒙next选择 Flutter 开发跨平台应用的原因
鸿蒙(HarmonyOS)是华为推出的一款旨在实现多设备无缝连接的操作系统。为了实现这一目标,鸿蒙选择了 Flutter 作为主要的跨平台应用开发框架。Flutter 的跨平台能力、高性能、丰富的生态支持和与鸿蒙系统的良好兼容性,使其成为理想的选择。通过 Flutter,开发者可以高效地构建和部署多平台应用,推动鸿蒙生态的快速发展。
392 0

热门文章

最新文章

  • 1
    【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 2
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 3
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
  • 4
    当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
  • 5
    零基础构建即时通讯开源项目OpenIM移动端-Flutter篇
  • 6
    flutter3-dart3-dymall原创仿抖音(直播+短视频+聊天)商城app系统模板
  • 7
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 8
    flutter3-wetrip跨平台自研仿携程app预约酒店系统模板
  • 9
    通过外部链接启动 Flutter App(详细介绍及示例)
  • 10
    Flutter 61: 图解基本 Button 按钮小结 (一)
  • 1
    flutter3-wetrip跨平台自研仿携程app预约酒店系统模板
    24
  • 2
    通过外部链接启动 Flutter App(详细介绍及示例)
    21
  • 3
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    118
  • 4
    零基础构建即时通讯开源项目OpenIM移动端-Flutter篇
    76
  • 5
    flutter3-dart3-dymall原创仿抖音(直播+短视频+聊天)商城app系统模板
    50
  • 6
    【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    159
  • 7
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    47
  • 8
    当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
    76
  • 9
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    160
  • 10
    【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
    85