gfxinfo 测试UI性能

gfxinfo 测试UI性能

参考:https://developer.android.com/training/testing/performance

gfxinfo 整个进程生命周期中收集的帧数据的聚合分析输出到 logcat

1
adb shell dumpsys gfxinfo <PackageName>

测试用例输出的信息如下(不同系统版本和不同品牌输出的信息会有出入):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
whyred:/ $ dumpsys gfxinfo com.benben.viewpractice
Applications Graphics Acceleration Info:
Uptime: 333026982 Realtime: 333026982

** Graphics info for pid 7200 [com.benben.viewpractice] **

Stats since: 332992087287593ns
Total frames rendered: 55
Janky frames: 9 (16.36%)
50th percentile: 6ms
90th percentile: 34ms
95th percentile: 117ms
99th percentile: 150ms
Number Missed Vsync: 2
Number High input latency: 10
Number Slow UI thread: 5
Number Slow bitmap uploads: 1
Number Slow issue draw commands: 0
Number Frame deadline missed: 5
HISTOGRAM: 5ms=1 6ms=31 7ms=6 8ms=5 9ms=1 10ms=1 11ms=0 12ms=0 13ms=0 14ms=1 15ms=0 16ms=0 17ms=0 18ms=0 19ms=1 20ms=1 21ms=0 22ms=0 23ms=0 24ms=0 25ms=0 26ms=0 27ms=0 28ms=0 29ms=0 30ms=0 31ms=0 32ms=1 34ms=
1 36ms=0 38ms=0 40ms=0 42ms=0 44ms=0 46ms=0 48ms=0 53ms=2 57ms=0 61ms=0 65ms=0 69ms=0 73ms=0 77ms=0 81ms=0 85ms=0 89ms=0 93ms=0 97ms=0 101ms=0 105ms=0 109ms=0 113ms=0 117ms=1 121ms=0 125ms=0 129ms=0 133ms=0 1
50ms=2 200ms=0 250ms=0 300ms=0 350ms=0 400ms=0 450ms=0 500ms=0 550ms=0 600ms=0 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 1
400ms=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 25
50ms=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 370
0ms=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 4850
ms=0 4900ms=0 4950ms=0
50th gpu percentile: 4ms
90th gpu percentile: 13ms
95th gpu percentile: 14ms
99th gpu percentile: 14ms
GPU HISTOGRAM: 1ms=0 2ms=0 3ms=6 4ms=28 5ms=0 6ms=1 7ms=0 8ms=1 9ms=0 10ms=0 11ms=0 12ms=0 13ms=2 14ms=4 15ms=0 16ms=0 17ms=0 18ms=0 19ms=0 20ms=0 21ms=0 22ms=0 23ms=0 24ms=0 25ms=0 4950ms=0
Font Cache (CPU):
Size: 15.01 kB
Glyph Count: 5
CPU Caches:
GPU Caches:
Other:
Other: 5.55 KB (1 entry)
Shadow Gaussian Falloff:
Texture: 128.00 bytes (1 entry)
SW Path Mask:
Texture: 579.89 KB (1 entry)
Image:
Texture: 6.82 MB (9 entries)
Scratch:
RenderTarget: 1.00 MB (1 entry)
Buffer Object: 78.00 KB (2 entries)
Texture: 5.00 MB (2 entries)
Other Caches:
Current / Maximum
Layers Total 0.00 KB (numLayers = 0)
Total GPU memory usage:
14124124 bytes, 13.47 MB (9.39 MB is purgeable)


Pipeline=Skia (OpenGL)
Profile data in ms:

com.benben.viewpractice/com.benben.viewpractice.MainActivity/android.view.ViewRootImpl@472c8b4 (visibility=0)
View hierarchy:

com.benben.viewpractice/com.benben.viewpractice.MainActivity/android.view.ViewRootImpl@472c8b4
18 views, 32.11 kB of render nodes


Total ViewRootImpl : 1
Total attached Views : 18
Total RenderNode : 32.11 kB (used) / 110.07 kB (capacity)

开始一栏是统计所有帧的聚合数据,主要作用是查看渲染性能以及帧的稳定性

  • Graphics info for pid 7200 [com.benben.viewpractice]:包名和 pid
  • Total frames rendered: 55:共收集了55帧
  • Janky frames: 9 (16.36%):55帧中有9帧发生了 Janky,即单帧耗时超过了 16ms,卡顿考为 16.36%
  • 50th percentile: 6ms:所有帧耗时排序后,其中前50%最大的耗时帧的耗时为6ms
  • 90th percentile: 34ms:同上,依次类推
  • 95th percentile: 117ms:同上,依次类推
  • 99th percentile: 150ms:同上,依次类推
  • Number Missed Vsync: 2:垂直同步失败的帧数为2
  • Number High input latency: 10:处理input耗时的帧数为10
  • Number Slow UI thread: 5:因UI线程的工作而导致耗时的帧数为5
  • Number Slow bitmap uploads: 1: 因bitmap加载导致耗时的帧数为1
  • Number Slow issue draw commands: 0:因绘制问题导致耗时的帧数为0
  • HISTOGRAM: 5ms=1 6ms=31 7ms=6 8ms=5 9ms=1 10ms=1 ...:直方图列表,说明耗时 5ms 帧数为 1,6ms 帧数为 31

剩余的是一写内存信息和视图信息

Framestats 数据

该命令会从应用生成的最近 120 个帧中输出带有纳秒时间戳的帧时间信息。【有的系统无效,有的只会输出10帧等等】

1
adb shell dumpsys gfxinfo <PACKAGE_NAME> framestats

测试用例输出的信息如下,重点关注PROFILEDATA信息,数据块是 CVS 格式输出,具体含义参考:https://developer.android.com/training/testing/performance#aggregate

1
2
3
4
5
6
7
8
9
10
...

---PROFILEDATA---
Flags,IntendedVsync,Vsync,OldestInputEvent,NewestInputEvent,HandleInputStart,AnimationStart,PerformTraversalsStart,DrawStart,SyncQueued,SyncStart,IssueDrawCommandsStart,SwapBuffers,FrameCompleted,DequeueBuffe
rDuration,QueueBufferDuration,GpuCompleted,
2,333378148003383,333378148003383,0,0,333378148003383,333378148003383,333378148003383,333378148003383,333378152421573,333378152423083,333378152547614,333378153769021,333378154564906,172656,282032,333378157419
907
---PROFILEDATA---

...

运行 gfxinfo、复制输出、将其粘贴到电子表格应用并将数据绘制成堆积条形图的结果

控制统计信息收集的时段

Framestats 和简单的帧时间均可在极短的时间内(相当于约 2 秒渲染)收集数据。要精确控制此时间范围(例如,将数据限制于特定动画),您可以重置所有计数器并汇总收集的统计信息

1
adb shell dumpsys gfxinfo <PACKAGE_NAME> reset

这也可以与转储命令结合使用来定期进行收集和重置,从而持续捕获时间范围不到 2 秒的帧