1.车机原始数据

用户界面(UI)性能测试不仅可以确保app满足其功能要求,而且能够保证用户与app之间的交互是相当平滑的——以每秒60帧的速度运行,即每一帧之间间隔16.6ms以内就认为没有丢帧,否者就会丢帧。

多媒体应用一般都是UI卡顿的重灾区,因此这次我们拿聚媒体应用来试试水。

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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
** Graphics info for pid 2782 [com.iflytek.autofly.mediax] **

Stats since: 168653953578ns
Total frames rendered: 16300
Janky frames: 4401 (27.00%)
50th percentile: 7ms
90th percentile: 27ms
95th percentile: 36ms
99th percentile: 61ms
Number Missed Vsync: 383
Number High input latency: 5239
Number Slow UI thread: 1001
Number Slow bitmap uploads: 9
Number Slow issue draw commands: 428
Number Frame deadline missed: 1389
HISTOGRAM: 5ms=5635 6ms=1499 7ms=1203 8ms=842 9ms=578 10ms=453 11ms=408 12ms=316 13ms=298 14ms=240 15ms=240 16ms=281 17ms=304 18ms=316 19ms=330 20ms=289 21ms=287 22ms=236 23ms=195 24ms=217 25ms=191 26ms=149 27ms=164 28ms=134 29ms=136 30ms=122 31ms=100 32ms=148 34ms=127 36ms=130 38ms=108 40ms=102 42ms=70 44ms=46 46ms=41 48ms=63 53ms=63 57ms=53 61ms=50 65ms=14 69ms=30 73ms=17 77ms=21 81ms=14 85ms=12 89ms=6 93ms=4 97ms=2 101ms=2 105ms=1 109ms=3 113ms=3 117ms=0 121ms=1 125ms=1 129ms=2 133ms=0 150ms=3 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 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: 735.71 kB
Glyph Count: 65
CPU Caches:
GPU Caches:
Other:
Buffer Object: 63.00 KB (2 entries)
Image:
Texture: 15.76 MB (12 entries)
Scratch:
Buffer Object: 64.00 KB (2 entries)
Texture: 1.00 MB (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:
17703664 bytes, 16.88 MB (15.88 MB is purgeable)


Pipeline=Skia (OpenGL)

Layout Cache Info:
Usage: 878/5000 entries
Hit ratio: 72934/73812 (0.988105)
Profile data in ms:

com.iflytek.autofly.mediax/com.iflytek.autofly.localmusic.MainActivity/android.view.ViewRootImpl@bd9aa6d (visibility=8)
Window: com.iflytek.autofly.mediax/com.iflytek.autofly.localmusic.MainActivity
Stats since: 168661745661ns
Total frames rendered: 9420
Janky frames: 1831 (19.44%)
50th percentile: 7ms
90th percentile: 26ms
95th percentile: 34ms
99th percentile: 57ms
Number Missed Vsync: 194
Number High input latency: 1991
Number Slow UI thread: 453
Number Slow bitmap uploads: 5
Number Slow issue draw commands: 223
Number Frame deadline missed: 673
HISTOGRAM: 5ms=3610 6ms=985 7ms=808 8ms=562 9ms=406 10ms=291 11ms=274 12ms=183 13ms=162 14ms=131 15ms=102 16ms=104 17ms=80 18ms=89 19ms=104 20ms=96 21ms=117 22ms=100 23ms=82 24ms=104 25ms=77 26ms=73 27ms=78 28ms=61 29ms=72 30ms=61 31ms=42 32ms=80 34ms=59 36ms=60 38ms=54 40ms=55 42ms=36 44ms=25 46ms=22 48ms=36 53ms=34 57ms=35 61ms=21 65ms=6 69ms=14 73ms=3 77ms=7 81ms=5 85ms=4 89ms=1 93ms=2 97ms=1 101ms=2 105ms=0 109ms=1 113ms=0 117ms=0 121ms=0 125ms=1 129ms=1 133ms=0 150ms=1 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 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


---PROFILEDATA---
Flags,IntendedVsync,Vsync,OldestInputEvent,NewestInputEvent,HandleInputStart,AnimationStart,PerformTraversalsStart,DrawStart,SyncQueued,SyncStart,IssueDrawCommandsStart,SwapBuffers,FrameCompleted,DequeueBufferDuration,QueueBufferDuration,
0,3316999928968,3316999928968,9223372036854775807,0,3317001414877,3317001423627,3317001424304,3317001474981,3317001537845,3317001629877,3317001778731,3317003556439,3317005974981,292000,129000,
0,3317149946849,3317166613515,9223372036854775807,0,3317170658991,3317170670502,3317170742377,3317170770866,3317170824252,3317173412793,3317173569304,3317174317064,3317179209824,154000,218000,

......

0,13708316673586,13708316673586,9223372036854775807,0,13708317381173,13708317392163,13708317392840,13708317425236,13708317536225,13708317587006,13708317634298,13708327112058,13708341493725,464000,283000,
0,13709633291209,13709649957875,9223372036854775807,0,13709654350548,13709654366068,13709654366798,13709654399662,13709654863829,13709655191850,13709655336798,13709661776641,13709664536798,1011000,550000,
0,13709666630708,13709666630708,9223372036854775807,0,13709678109402,13709678127475,13709678128620,13709678197214,13709678387318,13709678525912,13709678730548,13709684361225,13709686905600,156000,397000,
0,15773249439770,15773249439770,9223372036854775807,0,15773251623927,15773251670490,15773251671219,15773251732104,15773251848719,15773251875125,15773251923406,15773256408979,15773264913771,1008000,2923000,
---PROFILEDATA---


PopupWindow:a4ff523/android.view.ViewRootImpl@ae8f6a2 (visibility=8)
Window: PopupWindow:a4ff523
Stats since: 216927875278ns
Total frames rendered: 718
Janky frames: 580 (80.78%)
50th percentile: 26ms
90th percentile: 57ms
95th percentile: 73ms
99th percentile: 105ms
Number Missed Vsync: 110
Number High input latency: 275
Number Slow UI thread: 331
Number Slow bitmap uploads: 2
Number Slow issue draw commands: 3
Number Frame deadline missed: 336
HISTOGRAM: 5ms=12 6ms=6 7ms=2 8ms=4 9ms=1 10ms=11 11ms=6 12ms=14 13ms=24 14ms=27 15ms=17 16ms=17 17ms=18 18ms=21 19ms=21 20ms=24 21ms=25 22ms=16 23ms=29 24ms=27 25ms=27 26ms=17 27ms=25 28ms=21 29ms=15 30ms=18 31ms=17 32ms=17 34ms=21 36ms=29 38ms=28 40ms=19 42ms=19 44ms=9 46ms=10 48ms=15 53ms=14 57ms=8 61ms=15 65ms=5 69ms=9 73ms=9 77ms=9 81ms=5 85ms=3 89ms=3 93ms=0 97ms=1 101ms=0 105ms=1 109ms=2 113ms=2 117ms=0 121ms=1 125ms=0 129ms=1 133ms=0 150ms=1 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 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


---PROFILEDATA---
Flags,IntendedVsync,Vsync,OldestInputEvent,NewestInputEvent,HandleInputStart,AnimationStart,PerformTraversalsStart,DrawStart,SyncQueued,SyncStart,IssueDrawCommandsStart,SwapBuffers,FrameCompleted,DequeueBufferDuration,QueueBufferDuration,
1,922183814197,922183814197,922163445000,922171445000,922184357353,922185729853,922185852144,922189057874,922189297457,922190196363,922190289332,922192776051,922196442144,1815000,193000,
1,922217156051,922250489383,9223372036854775807,0,922255031571,922255055269,922255798967,922265472092,922265566988,922265638811,922265692144,922266163290,922267312665,66000,101000,
0,924267114653,924267114653,9223372036854775807,0,924268181571,924268201623,924268202664,924268676414,924268727091,924268836466,924268924800,924269442300,924271069852,185000,247000,

......

0,13088316501813,13088316501813,9223372036854775807,0,13088317970316,13088317997503,13088317998545,13088318102399,13088318257399,13088318392139,13088318423962,13088322688233,13088323788337,1166000,291000,
0,13090483121111,13090483121111,9223372036854775807,0,13090493434482,13090493449534,13090493450263,13090493477346,13090493505784,13090493682034,13090493714742,13090500268284,13090502717555,2523000,536000,
0,13092649821669,13092649821669,9223372036854775807,0,13092660657658,13092660672606,13092660673283,13092660757345,13092660785679,13092661141564,13092661175158,13092663018595,13092666056564,401000,803000,
0,13698799872395,13698799872395,9223372036854775807,0,13698800780187,13698800795708,13698800796489,13698800832583,13698800868364,13698801056177,13698801076073,13698803020656,13698804379250,391000,519000,
0,13709633291209,13709649957875,9223372036854775807,0,13709654350548,13709654366068,13709654366798,13709655434766,13709655447787,13709664635027,13709664742423,13709666301277,13709670211173,125000,238000,
---PROFILEDATA---


View hierarchy:

com.iflytek.autofly.mediax/com.iflytek.autofly.localmusic.MainActivity/android.view.ViewRootImpl@bd9aa6d
33 views, 34.29 kB of display lists

PopupWindow:a4ff523/android.view.ViewRootImpl@ae8f6a2
5 views, 5.20 kB of display lists


Total ViewRootImpl: 2
Total Views: 38
Total DisplayList: 39.48 kB

2.分析头数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
** Graphics info for pid 2782 [com.iflytek.autofly.mediax] **  // 表明当前dump的为聚媒体应用界面的帧信息,pid为2782

Stats since: 168653953578ns
Total frames rendered: 16300 //本次dump搜集了16300帧的信息
Janky frames: 4401 (27.00%) // 16300帧中有4401帧的耗时超过了16ms,卡顿概率为27.00%
50th percentile: 7ms
90th percentile: 27ms
95th percentile: 36ms
99th percentile: 61ms
Number Missed Vsync: 383 // 垂直同步失败的帧
Number High input latency: 5239 // 处理input事件超时的帧数
Number Slow UI thread: 1001 // 因UI线程上的工作导致超时的帧数
Number Slow bitmap uploads: 9 // 因bitmap的加载耗时的帧数
Number Slow issue draw commands: 428 // 因绘制导致耗时的帧数
Number Frame deadline missed: 1389
HISTOGRAM: 5ms=12 6ms=6 7ms=2 8ms=4 9ms=1 10ms=11 11ms=6 12ms=14 13ms=24 14ms=27 15ms=17 16ms=17 17ms=18 18ms=21 19ms=21 20ms=24 21ms=25 22ms=16 23ms=29 24ms=27 25ms=27 26ms=17 27ms=25 28ms=21 29ms=15 30ms=18 31ms=17 32ms=17 34ms=21 36ms=29 38ms=28 40ms=19 42ms=19 44ms=9 46ms=10 48ms=15 53ms=14 57ms=8 61ms=15 65ms=5
// 直方图数据,表示耗时为0-5ms的帧数为16,耗时为5-6ms的帧数为13,同理类推。

3.最近120帧关键数据

上面分析了头数据,下面分析最近120帧中获取非常详细的帧耗时信息,因此我们可以更准确地跟踪和调试问题。

1
2
3
4
# 默认打印所有应用的所有帧信息
dumpsys gfxinfo
# 打印某个应用的附近120帧信息,保存成csv好看一些
dumpsys gfxinfo < PACKAGE_NAME > framestats > E:\log\jack.csv
1
2
3
4
5
6
7
8
9
---PROFILEDATA---
Flags,IntendedVsync,Vsync,OldestInputEvent,NewestInputEvent,HandleInputStart,AnimationStart,PerformTraversalsStart,DrawStart,SyncQueued,SyncStart,IssueDrawCommandsStart,SwapBuffers,FrameCompleted,DequeueBufferDuration,QueueBufferDuration,
1,922183814197,922183814197,922163445000,922171445000,922184357353,922185729853,922185852144,922189057874,922189297457,922190196363,922190289332,922192776051,922196442144,1815000,193000,

......

0,13698799872395,13698799872395,9223372036854775807,0,13698800780187,13698800795708,13698800796489,13698800832583,13698800868364,13698801056177,13698801076073,13698803020656,13698804379250,391000,519000,
0,13709633291209,13709649957875,9223372036854775807,0,13709654350548,13709654366068,13709654366798,13709655434766,13709655447787,13709664635027,13709664742423,13709666301277,13709670211173,125000,238000,
---PROFILEDATA---

截取120帧详细信息如上,此输出的每一行代表app生成的一帧。每一行的列数都相同(16列),描述在生成帧的管道的每个阶段所花费的时间。

3.1 分析framestats各字段意思

下面来说明输出数据列的格式。所有时间戳都以纳秒为单位(1纳秒=1e-6毫秒)。

3.1.1 Flags

​ 如果flags为0,则此帧的总耗时时间 = FRAME_COMPLETED(第14列,帧的结束时间) - INTENDED_VSYNC(第2列,帧的预期开始时间)。
​ 如果flags不为0,则忽略该行,因为该帧的布局和绘制时间超过16ms,为异常帧。以下是可能发生的一些原因:
(1)窗口布局发生变化(例如app的第一帧或旋转后);
(2)帧被跳过也是有可能的,在这种情况下,某些值将具有垃圾时间戳。例如,如果帧超出60fps,或者屏幕上没有任何内容变脏,则可能跳过一个帧,这不一定是app中出现问题的迹象。

3.1.2 INTENDED_VSYNC

帧的预期开始时间。如果此值与VSYNC不同,则UI线程上发生了阻止其及时响应vsync信号的工作。

3.1.3 Vsync

花费在vsync监听器和帧绘制的时间(Choreographer frame回调,动画,View.getDrawingTime()等)。
要了解VSYNC的更多信息及其对app的影响,请查看Understanding VSYNC 视频。

以下结论来自上面视频所讲:如果帧率(GPU处理速度)和刷新频率不一致的时候,GPU处理速度比刷新速度快的时候,内存中下一帧数据覆盖部分上一帧数据,就会出现图像撕裂的情况。处理这种速率不一致的方式是采用双缓冲技术。

双缓冲技术:当GPU处理完数据之后,将数据存入后台缓冲区。然后将其拷贝到内存副缓冲区,也叫帧缓存区。当屏幕要刷新的时候,屏幕从帧缓存区获取数据显示,这样就不会出现撕裂情况,但是此时需要使用到Vsync信号。

当帧率高于刷新频率时,这情况是理想的。因为当屏幕需要刷新时,GPU都能将数据处理好存在帧缓存区中。因此屏幕都会刷新成功。GPU当处理完成一帧数据之后,将Vsync置位,当屏幕消耗了这帧数据,屏幕会将Vsync清空,GPU收到下一次屏幕刷新信号再继续处理下一帧数据。

当帧率低于刷新频率时,就会出现丢帧,屏幕显示的数据来自上一帧数据,用户就会感觉到卡顿(jank),迟缓(lag),打结(hitching)。

3.1.4 OldestInputEvent

输入队列中最早输入事件的时间戳。如果此帧没有输入事件,则为Long.MAX_VALUE。此值主要用于平台工作,对app开发人员的用处不大。

3.1.5 NewestInputEvent

输入队列中最后输入事件的时间戳,如果此帧没有输入事件,则为0。此值主要用于平台工作,对app开发人员的用处不大。但是,通过计算FRAME_COMPLETED - NEWEST_INPUT_EVENT的值,可以大致了解app添加的延迟时间。

3.1.6 HandleInputStart

将输入事件分派给app的时间戳。通过计算ANIMATION_START - HANDLE_INPUT_START的值,可以测量app处理输入事件所花费的时间。
如果它们的时间差很高(> 2ms),则表示app花费了非常长的时间处理输入事件,例如View.onTouchEvent(),这可能表示此工作需要优化,或者分发到其他线程。但是请注意,在某些情况下,例如发起新Activity或类似Activity的点击事件时,预计可接受的时间差是很大的。

3.1.7 AnimationStart

运行Choreographer注册动画的时间戳。
通过计算PERFORM_TRANVERSALS_START - ANIMATION_START的值,可以得到评估正在运行的所有动画器(ObjectAnimator,ViewPropertyAnimator和常用转换器)所花费的时间。
如果它们的时间差很高(> 2ms),请检查您的app是否已编写了自定义动画或者设置了ObjectAnimators动画的字段,并确保它们适用于动画。
要了解Choreographer的更多信息,请查看 For Butter or Worse 视频。

3.1.8 PerformTraversalsStart

计算DRAW_START - PERFORM_TRAVERSALS_START的值,可以得到完成布局和度量阶段所需的时间。(注意,在滚动或动画期间,你会希望它应该接近于零)
要了解有关渲染管道的度量和布局阶段的更多信息,请查看 Invalidations, Layouts and Performance 视频。

3.1.9 DrawStart

performTraversals的绘制阶段开始的时间戳。这是录制任何view视图的显示列表的起点。
此时间与SYNC_START之间的时间是在树中所有View视图上调用View.draw()所需的时间。
有关绘图模型的更多信息,请查看 Hardware Acceleration 或者 Invalidations, Layouts and Performance 视频。

3.1.10 SyncQueued

将同步请求发送到RenderThread的时间。
这标志着开始同步阶段的消息被发送到RenderThread的时刻。如果此时间与SYNC_START之间的时间差很长(> 0.1ms左右),则表示RenderThread正忙于处理不同的帧。在内部,这用于区分执行太多工作以至于超过16ms预算的帧和由于前一帧超过16ms预算而导致被停止的帧。

3.1.11 SyncStart

绘图同步阶段开始的时间。
如果此时间与ISSUE_DRAW_COMMANDS_START之间的时间很长(> 0.4ms左右),则通常表示已绘制了许多必须上传到GPU的新位图。
要了解有关同步阶段的更多信息,请查看 Profile GPU Rendering 视频。

3.1.12 IssueDrawCommandsStart

硬件渲染器开始向GPU发出绘图命令的时间。
计算FRAME_COMPLETED - ISSUE_DRAW_COMMANDS_START的值,可以大致了解app生成多少GPU工作。这里会出现很多过度绘制或低效的渲染效果等问题。

3.1.13 SwapBuffers

调用eglSwapBuffers的时间,在平台工作之外相对无用。

3.1.14 FrameCompleted

帧的结束时间戳。可以通过执行FRAME_COMPLETED - INTENDED_VSYNC来计算在此帧上工作的总时间。

3.1.15 DequeueBufferDuration和QueueBufferDuration

SurfaceFlinger转交数据的耗时:《SurfaceFlinger中queueBuffer与dequeueBuffer作用

DequeueBufferDuration:renderThread交换buffer中dequeueBuffer花费的时间

QueueBufferDuration:renderThread queueBuffer的时间

3.2 帧耗时数据的获取

如果在开发人员选项中将配置文件Profile GPU rendering为In adb shell dumpsys gfxinfo,该命令将打印出最近120帧耗时信息,并将其分成几个不同的类别,可以直观地显示各部分的快慢。
与上面的framestats类似,将它粘贴到我们选择的电子表格工具,或者使用脚本进行收集和解析非常简单。下图显示了app生成的许多帧耗时的细分。

img
此结果可以通过运行gfxinfo,复制输出,将其粘贴到excel工具中,并将数据绘制为直方图获取。
每个垂直条代表一帧动画,它的高度表示计算动画帧所用的毫秒数。条形图的每个彩色部分代表渲染管道的不同阶段,因此您可以看到app的哪些部分可能会产生瓶颈。有关了解渲染管道以及如何对其进行优化的详细信息,请查看 Invalidations Layouts and Performance 视频。

四 控制统计信息的收集

framestats和简单的帧耗时信息都是在非常短的时间内收集数据——大约2s收集一次(一次120帧,一帧16ms,耗时约2s)。为了精确控制此时间窗口,例如,将数据限制为特定的动画,您可以重置所有计数器,并重新聚合统计信息。

1
adb shell dumpsys gfxinfo <PACKAGE_NAME> reset

这也可以与dumps命令一起使用,以常规节奏进行收集和重置,连续获得少于2s的帧数据。

五 如何诊断性能问题

dumpsys能发现问题或者判断问题的严重性,但无法定位真正的原因。如果要定位原因并找到解决它们的适当方法,强烈建议使用systrace工具。systrace工具可以打印出问题附近几秒钟的所有调用栈,以及耗时,具体分析某个方法耗时情况。

参考文档

1.Android UI性能测试——使用 Gfxinfo 衡量性能

2.Rendering Performance 101

3.Why 60fps?

4.Android, UI, and the GPU

5.Invalidations, Layouts, and Performance

6.Analyzing UI Performance with Systrace