(转)Flutter性能监控工具(2)--- PerformanceOverlay简介

0x00 前言

PerformanceOverlay是在app上显示性能统计数据的浮窗。PerformanceOverlay是一个Widget,有几个属性,用于控制开启哪些功能。

0x01 PerformanceOverlay 分析

PerformanceOverlay的源码是:

~/flutter/packages/flutter/lib/src/widgets/performance_overlay.dart
复制代码

可以看出PerformanceOverlay有以下的属性:

  1. final int optionsMask:用于标记哪些功能打开的flag,有四个标志位,

    displayRasterizerStatistics :显示光栅化器统计信息(GPU) visualizeRasterizerStatistics :可视化光栅化器统计信息(GPU) displayEngineStatistics :显示引擎统计(CPU) visualizeEngineStatistics :可视化引擎统计(CPU)

  2. final int rasterizerThreshold: 光栅化的阈值,用于捕获SkPicture跟踪以进行进一步分析,它的值代表每隔几帧捕获一次,默认是0,代表功能是关闭的

  3. final bool checkerboardRasterCacheImages:检查缓存图片的情况

  4. final bool checkerboardOffscreenLayers:检查不必要的setlayer

0x02 启用 PerformanceOverlay

开启Performance Overlay的方法有三种:

1、 Flutter Inspector

Flutter Inspector是一个强大的工具,Performance Overlay的功能也集成在Flutter Inspector里。

需要我们运行Flutter APP后才可以使用,

  1. 在Android Studio里

选择 View > Tool Windows > Flutter Inspector,就可以打开Flutter Inspector,可以看到有很多功能,如下图:

image.png

然后选择Performance Overlay。

  1. 在VS Code里

通过 View > Command Palette 或者 cmd+p打开命令板,输入“performance” 然后选择 Toggle Performance Overlay 就行。

2. 使用代码设置

我们知道PerformanceOverlay是一个widget,PerformanceOverlay是在WidgetsApp里被使用的,MaterialApp又使用了WidgetsApp,所以我们通过给MaterialApp 或者 WidgetsApp 设置参数来控制PerformanceOverlay的功能。

所以为了,开启将PerformanceOverlay,要将MaterialApp 或者 WidgetsApp 的showPerformanceOverlay 属性设置为true,如下:

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      showPerformanceOverlay: true,
      title: 'My Awesome App',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'My Awesome App'),
    );
  }
}
复制代码

0x03 PerformanceOverlay:GPU、CPU统计信息

如下图:

image.png

这个浮窗有两个图形:

  1. 上面的是GPU thread

    表示在GPU线程上生成每帧需要的时间。

  2. 下面的UI thread

    表示在UI线程上生成每帧需要的时间。

  3. 纵轴

    图中的纵轴代表时间,每个图形都被分成三格,每小隔代表16ms,如果图中超过这三条线之一,那么您的运行频率低于60Hz。

  4. 横轴

    横轴代表帧。 该图仅在应用程序绘制时更新,因此如果它处于空闲状态,该图将停止移动。每个图形绘制的都是该线程最后300帧的数据。

为了保证60FPS,每帧耗费的时间应该是小于16ms的,看上图中绿色的粗线条,代表的是当前帧的数据,如果当前帧的数据符合预期(<16ms),那么就是绿色的,如果不符合,就是红色的,如下图:

image.png

遇到红色的就需要去具体分析,因为会造成APP卡顿:

  1. 如果GPU thread是红色的

    那么可能是绘制的图形过于复杂,或者是执行了过多的GPU操作。

  2. 如果UI thread是红色的

    说明肯定是Dart代码里有耗时操作,导致阻塞了UI操作。

  3. 如果两个都是红色的 建议从UI thread,也就是Dart代码查起。

0x03 GPU问题定位

辅助定位GPU问题的,就是PerformanceOverlay的下面两个功能:

  1. PerformanceOverlay:checkerboardRasterCacheImages -- 检查缓存图片的情况

    还有一个拖慢GPU渲染速度的是没有给静态图像做缓存,导致每次build都会重新绘制。我们可以把静态图像加到RepaintBoundry中,引擎会自动判断图像是否复杂到需要repaint boundary。

  2. PerformanceOverlay:checkerboardOffscreenLayers -- 检查不必要的setlayer

    setlayer是Canvas里的操作,非常耗性能,所以要尽量避免这个操作。你可能会好奇,我根本没用到这个,是的,我们一般是不会使用这个函数的,所以当你开启了这个检查后,会发现啥也没有,正好说明了你没有用到setlayer。我们一般都是被动的使用,比如需要剪切、透明的操作,用到一些widget的时候,这些widget会用到setlayer方法,一旦遇到这种情况,我们要想一下是否一定要这么做,能不能通过其他方式实现。

开启这两个功能的方法:

MaterialApp(
    showPerformanceOverlay: true,
    checkerboardOffscreenLayers: true, //使用了saveLayer的图像会显示为棋盘格式并随着页面刷新而闪烁
    checkerboardRasterCacheImages: true, // 做了缓存的静态图像图片在刷新页面使不会改变棋盘格的颜色;如果棋盘格颜色变了,说明被重新缓存,这是我们要避免的
    ...
);
复制代码

0x04 GPU优化 tip

  1. 一些效果尽量设置在子Widget上,而不是父Widget

例如,要实现一个混合图层的半透明效果,如果把透明度设置在顶层Widget上,CPU会把每个子Widget的图层渲染出来,在执行saveLayer操作保存为一个图层,最后给这个图层设置透明度,但是saveLayer的开销很大,所以官方给出建议:首先确认这些效果是否真的有必要;如果有必要,应该把透明度设置到每个子Widget上,而不是父Widget。裁剪操作也是类似。

0x05 UI问题定位

可以使用 Observatory里的timeline的功能分析。

作者:小德_Kurt
链接:https://juejin.im/post/5c4d3ef66fb9a049b13e95b7
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345