但是我们还需要在性能方面有一个比较明确的数据对比。

我们最关心的两个页面性能指标就是页面加载时间和页面渲染速度。测试页面加载速度可以直接使用美团内部的Metrics性能测试工具,我们将页面Activity对象创建作为页面加载的开始时间,页面API数据返回作为页面加载结束时间。

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

因为Flutter的UI逻辑和绘制代码都不在主线程执行,Metrics原有的FPS功能无法统计到Flutter页面的真实情况,我们需要用特殊方法来对比两种实现的渲染效率。Android原生实现的界面渲染耗时使用系统提供的FrameMetrics接口进行监控:


public class AllCategoryActivity extends WmBaseActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {getWindow().addOnFrameMetricsAvailableListener(new Window.OnFrameMetricsAvailableListener() {List<Integer> frameDurations = new ArrayList<>(100);@Overridepublic void onFrameMetricsAvailable(Window window, FrameMetrics frameMetrics, int dropCountSinceLastInvocation) {frameDurations.add((int) (frameMetrics.getMetric(TOTAL_DURATION) / 1000000));if (frameDurations.size() == 100) {getWindow().removeOnFrameMetricsAvailableListener(this);L.w("AllCategory", Arrays.toString(frameDurations.toArray()));}}}, new Handler(Looper.getMainLooper()));}super.onCreate(savedInstanceState);// ...}} 

Flutter在Framework层只能取到每帧中UI操作的CPU耗时,GPU操作在Flutter引擎内部实现,所以要修改引擎来监控完整的渲染耗时,在Flutter引擎目录下src/flutter/shell/common/http://rasterizer.cc文件中添加:


void Rasterizer::DoDraw(std::unique_ptr<flow::LayerTree> layer_tree) {if (!layer_tree || !surface_) {return;}if (DrawToSurface(*layer_tree)) {last_layer_tree_ = std::move(layer_tree);#if defined(OS_ANDROID)if (compositor_context_->frame_count().count() == 101) {std::ostringstream os;os << "[";const std::vector<TimeDelta> &engine_laps = compositor_context_->engine_time().Laps();const std::vector<TimeDelta> &frame_laps = compositor_context_->frame_time().Laps();size_t i = 1;for (auto engine_iter = engine_laps.begin() + 1, frame_iter = frame_laps.begin() + 1;i < 101 && engine_iter != engine_laps.end(); i++, engine_iter++, frame_iter++) {os << (*engine_iter + *frame_iter).ToMilliseconds() << ",";}os << "]";__android_log_write(ANDROID_LOG_WARN, "AllCategory", os.str().c_str());}#endif

Flutter的原理及美团的实践(下,100%好评相关推荐

  1. 国内少有的Flutter干货分享:Flutter的原理及美团的实践!

    关注公众号"风色年代"订阅更多精彩文章,本博大部分文章为转载并已标明原文出处,如有再转敬请保留,请自觉尊重原创作者的劳动成果! 原文:http://blog.itpub.net/3 ...

  2. 「转」国内少有的Flutter干货分享:Flutter的原理及美团的实践!

    Flutter是Google开发的一套全新的跨平台.开源UI框架,支持iOS.Android系统开发,并且是未来新操作系统Fuchsia的默认开发套件.自从2017年5月发布 第一个版本 以来,目前F ...

  3. Flutter的原理及美团的实践

    总第272篇 2018年 第64篇 导读 Flutter是Google开发的一套全新的跨平台.开源UI框架,支持iOS.Android系统开发,并且是未来新操作系统Fuchsia的默认开发套件.自从2 ...

  4. Flutter的原理及美团的实践!

    Flutter是Google开发的一套全新的跨平台.开源UI框架,支持iOS.Android系统开发,并且是未来新操作系统Fuchsia的默认开发套件.自从2017年5月发布 第一个版本 以来,目前F ...

  5. Flutter入门系列(二)---Flutter的原理及美团的实践

    转载自:美团技术团队 导读 Flutter是Google开发的一套全新的跨平台.开源UI框架,支持iOS.Android系统开发,并且是未来新操作系统Fuchsia的默认开发套件.自从2017年5月发 ...

  6. Flutter原理与美团的实践

    Flutter是Google开发的一套全新的跨平台.开源UI框架,支持iOS.Android系统开发,并且是未来新操作系统Fuchsia的默认开发套件.自从2017年5月发布第一个版本以来,目前Flu ...

  7. Flutter 实现原理及在马蜂窝的跨平台开发实践

    一直以来,跨平台开发都是困扰移动客户端开发的难题. 在马蜂窝旅游 App 很多业务场景里,我们尝试过一些主流的跨平台开发解决方案, 比如WebView 和 React Native,来提升开发效率和用 ...

  8. Presto实现原理和美团的使用实践

     Presto实现原理和美团的使用实践 Facebook的数据仓库存储在少量大型Hadoop/HDFS集群.Hive是Facebook在几年前专为Hadoop打造的一款数据仓库工具.在以前,Fac ...

  9. Flutter 实现原理及跨平台实践

    一直以来,跨平台开发都是困扰移动客户端开发的难题. 在马蜂窝旅游 App 很多业务场景里,我们尝试过一些主流的跨平台开发解决方案, 比如WebView 和 React Native,来提升开发效率和用 ...

最新文章

  1. 【小贴士】在线画流程图工具
  2. springMVC和Shiro框架整合使用简单示例 【转】
  3. [poj]poj1860(SPFA)
  4. 论文解读:Attention is All you need
  5. 最聪明的如何成为优秀的——微软高管指点成材路
  6. linux日志搜索关键词_linux中的实用技巧和快捷键总结
  7. SHELL中变量字串中包含$时怎么办?
  8. 南阳理工ACM 题目252 01串
  9. 群晖设置php.ini,【入门普及贴】群晖NAS组装、洗白经验总结及分享
  10. 点餐小程序源代码|餐饮小程序源码PHP全开源开发
  11. caxa 拉伸命令的使用(一次拉伸很多线)
  12. iphone模拟器安装app
  13. 软件工程师能力自我评价表
  14. java 对接微信公众号(二)获取关注取关事件/用户回复消息
  15. oracle左连接应用场景,Oracle左连接left join 的实际操作与应用
  16. 【HDU4960】Another OCD Patient
  17. CSAPP Bomb Lab
  18. jquery服务器文件保存到本地,jQuery本地存储
  19. Sequence operation HDU - 3397
  20. android电话、短信黑白名单拦截、电话录音

热门文章

  1. 淘宝 模拟 登录 总结 【QQ 346767073 】
  2. BAT 把持的小程序领地,现在入场的今日头条还有救吗?
  3. setup/teardown用法汇总
  4. Java实现CRC16 CCITT
  5. STM32L071 Flash写入的数据进行CRC-CCITT校验
  6. 移动支付模式方面的技术
  7. 消息中心(系统消息)实现
  8. 如何查看Dell笔记本型号?
  9. Qt使用QMediaplayer实现视频播放和简易音乐播放
  10. TAM: TEMPORAL ADAPTIVE MODULE FOR VIDEO RECOGNITION ∗