Flutter的原理及美团的实践(下)

  • 时间:
  • 浏览:0
  • 来源:大发五分时时彩—大发分分时时彩

日后 当我们我们我们 歌词 还还可否 在性能方面有一个 比较明确的数据对比。

Android原生实现和Flutter版本时会在页面打开的前5帧超过16ms,刚打开页面时原生实现还可否 创建极少量View,Flutter才还可否 创建极少量Widget,后续帧中还可否 重用大部分控件和渲染节点(原生的RenderNode和Flutter的RenderObject),许多许多启动时的布局和渲染操作全是最耗时的。

将测试结果的100次启动中每帧耗时取平均値,得到每帧平均耗时情形(横坐标轴为帧序列,纵坐标轴为每帧耗时,单位为毫秒):

1000帧(100次×100帧每次)中Android原生总平均値为10.21ms,Flutter总平均値为12.28ms,Android原生实现总丢帧数851帧8.51%,Flutter总丢帧987帧9.87%。在原生实现的触摸事件补救和过度绘制充分优化的前提下,Flutter完整性还可否 媲美原生的性能。

阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/47431006100

开发Flutter应用这么 使用Dart语言,Dart两种 既有静态语言的价值形式,也支持动态语言的部分价值形式,对于Java和JavaScript开发者来说门槛全是高,3-半个月还可否 快速上手,相当于1-2周还可否 熟练掌握。

当我们我们我们 歌词 最关心的一个 页面性能指标也不页面加载时间和页面渲染速率。测试页面加载速率还可否 直接使用美团组织组织结构的Metrics性能测试工具,当我们我们我们 歌词 将页面Activity对象创建作为页面加载的现在刚开始时间,页面API数据返回作为页面加载现在刚开始时间。

在开发全品类页面的Flutter版本时当我们我们我们 歌词 也深刻体会到了Dart语言的魅力,Dart的语言价值形式使得Flutter的界面构建过程也比Android原生的XML+JAVA更直观,代码量也从另一个 的900多行减少到100多行(排除掉引用的公共组件)。Flutter页面集成到App后APK体积相当于会增加5.5MB,其中包括3.3MB的SO库文件和2.2MB的ICU数据文件,此外业务代码1100行编译产物的大小有2MB左右。

我我觉得使用原生实现(左)和Flutter实现(右)的全品类页面在实际使用过程中几乎分辨什么都这么来:

意味着Flutter的UI逻辑和绘制代码全是在主进程池执行,Metrics原有的FPS功能无法统计到Flutter页面的真实情形,当我们我们我们 歌词 还可否 用特殊法子 来对比两种 实现的渲染速率。Android原生实现的界面渲染耗时使用系统提供的FrameMetrics接口进行监控:

Flutter两种 的价值形式适合追求iOS和Android跨平台的一致体验,追求高性能的UI交互效果的场景,不适合追求动态化部署的场景。Flutter在Android上意味着还可否 实现动态化部署,日后 意味着Apple的限制,在iOS上实现动态化部署非常困难,Flutter团队也正在和Apple积极沟通。

原文作者:美团技术团队

原文链接:https://zhuanlan.zhihu.com/p/417321003

阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/47431006100

Flutter目前仍位于早期阶段,也还这么 发布正式的Release版本,不过当我们我们我们 歌词 想看 Flutter团队一直在为你这个 目标而努力。我我觉得Flutter的开位于态不如Android和iOS原生应用这么 性性心智心智开花结果是什么的句子的句子的句子的句子 的句子期是什么是什么期,许多常用的复杂性控件还还可否 另一方实现,有的甚至会比较困难(比如官方尚未提供的ListView.scrollTo(index)功能),日后 在高性能和跨平台方面Flutter在众多UI框架中还是有很大优势的。

Flutter和原生性能对比

即可得到每帧绘制时真正消耗的时间。测试时当我们我们我们 歌词 将两种 实现的页面分别打开100次,每次打开后执行两次滚动操作,使其绘制100帧,将这100帧的每帧耗时记录下来:

Flutter在Framework层这么 取到每帧中UI操作的CPU耗时,GPU操作在Flutter引擎组织组织结构实现,许多许多要修改引擎来监控完整性的渲染耗时,在Flutter引擎目录下src/flutter/shell/common/http://rasterizer.cc文件中加上:

从一个 实现的页面分别启动100多次的数据中还可否 想看 ,原生实现(AllCategoryActivity)的加载时间中位数为210ms,Flutter实现(FlutterCategoryActivity)的加载时间中位数为231ms。考虑到目前当我们我们我们 歌词 还这么 针对FlutterView做缓存和重用,FlutterView每次创建都还可否 初始化整个Flutter环境并加载相关代码,多出的20ms还在预期范围内: