绘制性能分析:GPU Rendering Profile
随着手机硬件的发展,内存从当初512Mb到现在的12Gb甚至更多,CPU也换代到了晓龙865,手机运行速度越来越快,能够运行更多应用,功能更加丰富,硬件和软件之间在发展道路上相互促进。虽然硬件发展,但是软件也还是需要进行优化,不能无限制的使用手机硬件资源。因为手机作为便携的移动设备,本身的性能就无法和PC相媲美。
APP的性能优化是应用开发过程中,除了完成基本功能开发之外比较重要的一个环节。优化涉及到的知识点很多,方方面面:绘制优化、内存优化、电量优化、启动速度、APK优化等等。
1、 绘制简介
从事Android开发的对View的绘制都再熟悉不过了,View的绘制分为三步:measure、layout、draw,这三步都是Android Frameworks提供的开发接口,而真正的绘制是在Native层的SurfaceFlinger服务。
1.1、60fps 16ms
通常手机的帧率在60fps,Android系统每隔16ms就会发送VSYNC信号,触发UI界面的刷新。
1000ms÷60fps = 16ms/fps
所以主线程也就是UI线程的操作不能费时,超过16ms就无法正常渲染,达不到60fps,严重的情况下会出现卡顿。
1.2、卡顿原因
从上面简单的背景就可以明白,各种造成卡顿的疑难杂症归根结底都将导致UI经常无法在16ms内完成操作,导致丢帧。
①布局过于复杂,层级太深。布局优化见《布局优化 & 过度绘制检测》
②动画过于复杂
③View过度绘制,同一块区域被绘制覆盖多次
④UI线程执行耗时操作
⑤频繁GC导致进程暂停,产生卡顿
2、 GPU Rendering Profile简介
光靠工程师或者体验去使用有时候很难看出卡顿,还好有很多工具帮助我们分析绘制卡顿。这里介绍的就是Android手机自带的开发者选项:GPU Rendering Profile
在开发者选项监控菜单组中有一个菜单:GPU呈现模式分析。打开就可以去自己的应用查看绘制的卡顿情况。

但是还要先来了解一下上面那几种颜色。Google给出官方的颜色说明(Analyze with Profile GPU Rendering)
![]()
①MiscTime/VSync Delay:代表在连续两帧间的时间间隔,可能是因为子线程执行时间过长抢占了UI线程被cpu执行的机会
②Input Handing:代表app在用户输入事件回调中花费的时间,这部分过高可能意味着app处理用户输入事件时间过长,建议将操作分流到工作线程
③Animation:代表为该帧内所有animator求值(属性动画中代表通过估值器计算属性的具体值)
④Measure/Layout:代表了onLayout和onMeasure方法消耗的总时间,这段很高代表遍历整个view树结构花费了太多时间
⑤Draw:代表创建更新DisplayList的时间,过高代表在onDraw中花费过多时间,可能是自定义画图操作太多或执行了其它操作
⑥Sync/upload:向CPU传输Bitmap花费的时间,过高代表了加载了大量图形
⑦Issue commands:Android 2D渲染器向OpenGL发出命令绘制或重绘display lists 花费的时间,柱子的高度等于所有Display list绘制时间的总和
⑧Process/Swap buffers:代表cpu在等待gpu完成工作,如果过高代表GPU需要完成的工作过多
3、 GPU分析模式
GPU Rendering Profile提供两种呈现模式分析:在屏幕上显示为条形图和在adb shell dumpsys gfxinfo输出日志。
3.1、条形图
打开开发者选项 > GPU呈现模式分析 > 在屏幕上显示为条形图。进入需要调试的应用即可直观的查看页面绘制情况。

3.2、日志
打开开发者选项 > GPU呈现模式分析 > 在adb shell dumpsys gfxinfo中

输出下面的命令查看绘制输出的日志
adb shell dumpsys gfxinfo截取部分绘制日志如下:
** Graphics info for pid 19030 [com.baidu.input_huawei] **
Stats since: 37817926843708ns
Total frames rendered: 52
Janky frames: 14 (26.92%)
50th percentile: 10ms
90th percentile: 40ms
95th percentile: 150ms
99th percentile: 150ms
Number Missed Vsync: 9
Number High input latency: 4
Number Slow UI thread: 13
Number Slow bitmap uploads: 2
Number Slow issue draw commands: 1
Number Frame deadline missed: 14
HISTOGRAM: 5ms=6 6ms=6 7ms=7 8ms=3 9ms=4 10ms=1 11ms=1 12ms=2 13ms=3 14ms=3 15ms=1 16ms=1 17ms=0 18ms=1 19ms=0 20ms=1 21ms=0 22ms=0 23ms=0 24ms=1 25ms=0 26ms=1 27ms=0 28ms=0 29ms=0 30ms=0 31ms=1 32ms=1 34ms=1 36ms=1 38ms=0 40ms=1 42ms=1 44ms=0 46ms=0 48ms=0 53ms=0 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=1 113ms=0 117ms=0 121ms=0 125ms=0 129ms=0 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: 100.87 kB
Glyph Count: 17
CPU Caches:
GPU Caches:
Other:
Other: 0.00 bytes (1 entry)
Image:
Texture: 872.12 KB (18 entries)
Scratch:
Texture: 4.00 MB (1 entry)
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:
5136508 bytes, 4.90 MB (872.12 KB is purgeable)相关博客:
Analyze with Profile GPU Rendering

