Android性能测试之界面显示GPU绘制

HierarchyViewer查看Activity布局是否过于复杂,开发者选项中的“调试GPU过度绘制”等选项观察Android App界面显示的性能瓶颈。

GPU过度绘制

Overdraw(过度绘制):屏幕上的某个像素在同一帧的时间内被绘制了多次。多层次的UI结构容易出现过度绘制,导致CPU、GPU资源浪费。

例如某个Activity有一个背景,里面的Layout和子View又分别有自己的背景。移除非必须的背景图片,就能减少大量的Overdraw区域。

开发者选项–>调试GPU过度绘制(Show GPU Overdraw)–>显示过度绘制区域,开启后App更新UI时,屏幕上以不同颜色标记过度绘制的情况,深红4X>浅红3X>绿色2X>蓝色1X代表了4种不同程度的过度绘制。

没有颜色:没有overdraw
蓝色:重复绘制一次
绿色: 重复绘制两次,中等大小的绿色区域可以接受,尽量优化减少区域大小。
浅红: 重复绘制三次,小范围可以接受。
深红: 重复绘制4次以上,需要修复。

非可见的UI组件进行绘制更新会导致过度绘制,Android系统会通过避免绘制那些完全不可见的组件来尽量减少资源浪费,但Android系统无法检测高度自定义的UI组件,也就无法避免Overdraw。通过canvas.clipRect()来帮助系统识别那些可见的区域,还可以使用canvas.quickreject()来判断是否没和某个矩形相交,从而跳过那些非矩形区域内的绘制操作。

Android App界面卡顿

开发者选项–>GPU呈现模式分析(Profile GPU Rendering)–>在屏幕上显示为条形图(On screen as bars)。

随着UI的刷新,界面上滚动显示垂直的柱状图来表示每帧画面所需要渲染的时间。中间绿色的横线代表16ms,我们需要确保每一帧花费的总时间都低于这条横线,这样才能够避免出现卡顿的问题。

每一条柱状线都包含三部分,蓝色代表测量绘制Display List的时间,红色代表OpenGL渲染Display List所需要的时间,黄色代表CPU等待GPU处理的时间。

为什么是16ms:人眼与大脑之间的协作无法感知超过60fps的画面更新,Android系统每隔16ms发出VSYNC信号,触发对UI进行渲染,这样就能够达到流畅的画面所需要的60fps,为了能够使得App流畅,我们需要在每一帧16ms以内处理完所有的CPU与GPU计算,绘制,渲染等操作。

大多数手机的屏幕刷新频率是60hz,如果在1000/60=16.67ms内没有把这一帧的任务执行完毕,就会发生丢帧,丢帧越多,用户感受到的卡顿就越严重。

视图更新

通过开发者选项里面的显示GPU视图更新(Show GPU view updates)来查看视图更新的操作,View中的绘制内容发生变化时,会重新执行创建、渲染、更新到屏幕等一系列操作。

其它

Refresh Rate:屏幕一秒内刷新的次数,取决于硬件的固定参数,例如60Hz。
Frame Rate:GPU一秒内绘制操作的帧数,例如30fps,60fps。

Hierarchy Viewer可以呈现布局的层次关系,视图组件的各种属性。 通过红,黄,绿三种不同的颜色来区分布局的Measure,Layout,Executive的相对性能表现。

启用OpenGL跟踪 — 开启后用Logcat、Systrace或glGetError来跟踪OpenGL的执行。
显示硬件层更新 — 硬件层更新时闪动绿色。
强制启用4X MSAA — 在Open GL ES 2.0应用中启用4X MSAA支持。