背景
想通过图标的方式看看最近app是绘制的状况,通过抓帧数据后发现数据不好看,不够直观,现在我们把数据加工一下。
抓app最近的绘制的数据
adb shell dumpsys gfxinfo com.debug.sob.system
拿到最近的数据,我在抓之前,在文章列表中上下`超高速滑动`
Applications Graphics Acceleration Info:
Uptime: 105015831 Realtime: 1160530295
** Graphics info for pid 17771 [com.debug.sob.system] **
Stats since: 103079848968914ns
Total frames rendered: 2901 #总抓到2901帧
Janky frames: 95 (3.27%) #掉帧率
50th percentile: 5ms
90th percentile: 8ms
95th percentile: 11ms
99th percentile: 34ms
Number Missed Vsync: 17 # 垂直同步失败的帧
Number High input latency: 2626 # 处理input时间超时的帧数
Number Slow UI thread: 46 # 因UI线程上的工作导致超时的帧数
Number Slow bitmap uploads: 0 # 因bitmap的加载耗时的帧数
Number Slow issue draw commands: 8 4 # 因绘制导致耗时的帧数
Number Frame deadline missed: 54 #错误截止时间的数量,我猜测是被丢弃的
HISTOGRAM: 5ms=2162 6ms=280 7ms=147 8ms=78 9ms=46 10ms=34 11ms=25 12ms=9 13ms=6 14ms=8 15ms=6 16ms=15 17ms=14 18ms=8 19ms=5 20ms=6 21ms=0 22ms=5 23ms=2 24ms=2 25ms=1 26ms=1 27ms=2 28ms=1 29ms=1 30ms=1 31ms=0 32ms=4 34ms=4 36ms=1 38ms=3 40ms=2 42ms=1 44ms=2 46ms=0 48ms=0 53ms=3 57ms=0 61ms=1 65ms=2 69ms=0 73ms=2 77ms=1 81ms=1 85ms=0 89ms=2 93ms=1 97ms=1 101ms=1 105ms=0 109ms=0 113ms=0 117ms=0 121ms=0 125ms=0 129ms=1 133ms=0 150ms=0 200ms=0 250ms=0 300ms=0 350ms=0 400ms=0 450ms=0 500ms=0 550ms=2 600ms=1 650ms=0 700ms=0 750ms=0 800ms=0 850ms=0 900ms=0 950ms=0 1000ms=0 1050ms=0 1100ms=0 1150ms=0 1200ms=0 1250ms=0 1300ms=0 1350ms=0 1400ms=0 1450ms=0 1500ms=0 1550ms=0 1600ms=0 1650ms=0 1700ms=0 1750ms=0 1800ms=0 1850ms=0 1900ms=0 1950ms=0 2000ms=0 2050ms=0 2100ms=0 2150ms=0 2200ms=0 2250ms=0 2300ms=0 2350ms=0 2400ms=0 2450ms=0 2500ms=0 2550ms=0 2600ms=0 2650ms=0 2700ms=0 2750ms=0 2800ms=0 2850ms=0 2900ms=0 2950ms=0 3000ms=0 3050ms=0 3100ms=0 3150ms=0 3200ms=0 3250ms=0 3300ms=0 3350ms=0 3400ms=0 3450ms=0 3500ms=0 3550ms=0 3600ms=0 3650ms=0 3700ms=0 3750ms=0 3800ms=0 3850ms=0 3900ms=0 3950ms=0 4000ms=0 4050ms=0 4100ms=0 4150ms=0 4200ms=0 4250ms=0 4300ms=0 4350ms=0 4400ms=0 4450ms=0 4500ms=0 4550ms=0 4600ms=0 4650ms=0 4700ms=0 4750ms=0 4800ms=0 4850ms=0 4900ms=0 4950ms=0
Font Cache (CPU):
Size: 1539.71 kB
Glyph Count: 90
CPU Caches:
GPU Caches:
Other:
Other: 76.27 KB (1 entry)
Buffer Object: 2.05 KB (2 entries)
Image:
Texture: 19.82 MB (90 entries)
Scratch:
Texture: 8.62 MB (5 entries)
Buffer Object: 48.00 KB (1 entry)
Other Caches:
Current / Maximum
VectorDrawableAtlas 0.00 kB / 0.00 KB (entries = 0)
Layers Total 0.00 KB (numLayers = 0)
Total GPU memory usage:
29948764 bytes, 28.56 MB (20.09 MB is purgeable)
Pipeline=Skia (OpenGL)
Layout Cache Info:
Usage: 2623/5000 entries
Hit ratio: 41293/43916 (0.940272)
Profile data in ms:
com.debug.sob.system/com.android.debug.ui.main.MainActivity/android.view.ViewRootImpl@18f0b2f (visibility=0)
View hierarchy:
com.debug.sob.system/com.android.debug.ui.main.MainActivity/android.view.ViewRootImpl@18f0b2f
463 views, 662.24 kB of display lists
Total ViewRootImpl: 1
Total Views: 463
Total DisplayList: 662.24 kB
这样看,数据是不够直观
的。
整理数据
把帧耗时的数据复制出来,放到Excel中的第一个单元格
,粘贴。就是下面这样了。
选中第一个单元格
,点击上面的数据
,然后点击分列
功能。
分列选择使用分隔符
,点击下一步。
选择空格
,点击完成。
这样子就把数据用空格分割了,让他们填充到每一个单元格中。
接下里我们把水平放置的数据切换到垂直放置。快捷键ctrl shift →
然后整行ctrl c
在第二个单元格
位置,右键粘贴,选择性粘贴
。
选择转置
,完成。
现在我们的数据是5ms=23这种格式,继续用分列功能拆开。
把第一行的数据删除了,继续下一步。 整列选中后,选择数据
,分列
,智能分列
就行,点击完成。 如果没有智能分列,就选择分列,选择分割的符号=
这样就把数据完成分列,也就是左边是帧绘制的时间
,右边是这个时间对应的数量
。可以进行图标制作了。
选择2列,然后插入
,图表
,找一个免费的图表,点击就能生成了。
可以看到数据几乎都是5ms内完成绘制,我的手机是60帧,也就是16.6ms内完成绘制都是正常的。图表还有其他功能,可以把每个x轴上面的维度对应的具体数值也显示出来。
可以通过数据标签方式把x轴的数据显示出来,应该还有其他样式的,但是我不是vip没法做,可以看看下面的效果。
经过我们处理后的数据就直观多了,在超高速滑动情况下,有些帧耗时非常高600ms,这情况下很明显了,但是在操作的时候并没发现这么卡的情况,会不会是bug呢。按理来说600ms会明显顿一下了,这数据貌似不科学啊。有么有大佬科普下呢。还有就是别人这个命令抓出来的通常都是2s的数据,2s就是120帧,但是我的结果有2k多帧~~~~~~。我再查查资料吧。
后续:经过我检查发现,原来我手机上面的包是debug包,怪不得~
总结
整个数据整理的过程就是这样了,第一,adb抓数据,然后Excel分析,以上图表制作是我家爱人指导我完成的,嘻嘻。
如果上面的操作还不够仔细,我可以做一个录屏给大家,如果没人反馈,就不做了~
Excel部分的录屏操作:【Android性能优化帧数据抓取和整理-哔哩哔哩】 https://b23.tv/AH4NDJx