Android 包含一些设备上开发者选项,可帮助您直观地了解您的应用在何处出现界面渲染问题,如执行太多不必要的渲染工作,或执行长时间的线程和 GPU 操作。
1. 分析 GPU 的渲染速度
Profile GPU Rendering 工具以滚动直方图的形式直观地显示渲染界面窗口帧所花费的时间(以每帧 16 毫秒的速度作为对比基准)。
在性能较低的 GPU 上,可用的填充率(GPU 填充帧缓冲区的速度)可能很低。 随着绘制帧所需的像素数增加,GPU 可能需要花较长时间来处理新命令,并要求系统的其余任务等待,直到系统可以跟上需求。 此分析工具可帮助您确定 GPU 何时因尝试绘制像素而负担过重,或何时因大量的过度绘制而被拖累。
注:此分析工具不适用于使用 NDK 的应用。 这是因为当 OpenGL 提取全屏上下文时,系统会将框架消息推送到后台。 在此情况下,您可能会发现 GPU 制造商提供的分析工具会很有帮助。
1.1.启用分析器
开始前,请确保您使用的是运行 Android 4.1(API 级别 16)或更高版本的设备,并启用开发者选项。 要在使用应用时开始分析设备 GPU 渲染,请执行以下操作:
1) 在您的设备上,转到 Settings 并点按 Developer Options。
2) 在 Monitoring 部分,选择 Profile GPU Rendering。
3) 在 Profile GPU Rendering 对话框中,选择 On screen as bars 以在设备屏幕上叠加图表。
4) 打开您要分析的应用。
1.2.检查输出
在图 1 中显示的放大的 Profile GPU Rendering 图表图像中,您会看到 Android 6.0(API 级别 23)上显示的彩色部分。
首先,在Android系统中是以每秒60帧为满帧的,那么只要将1秒÷60帧,就能得出每帧为16毫秒(ms)时为满帧的界限,每帧快于16ms即为流畅
GPU-RENDERING-PROFILE(后面简称GRP)可以通过在屏幕上绘制滚动的柱状图来显示绘制每一帧所消耗的时间,每根柱子由不同的颜色构成,分别代表UI绘制的不同阶段,并且在柱状图的中间还有一根绿色的横线代表16ms的绘制时间基准,而这根绿线所标示的高度即为16ms线,低于绿线即为流畅。GRP会统计并显示app最近运行的128帧。
图 1. 放大的 Profile GPU Rendering 图表。
以下是有关输出的几点注意事项:
l 对于每个可见应用,此工具将显示一个图表。
l 沿水平轴的每个竖条都代表一个帧,每个竖条的高度表示渲染该帧所花的时间(单位:毫秒)。
l 水平绿线表示 16 毫秒。 要实现每秒 60 帧,代表每个帧的竖条需要保持在此线以下。 当竖条超出此线时,可能会使动画出现暂停。
l 此工具通过加宽对应的竖条并降低透明度来突出显示超出 16 毫秒阈值的帧。
l 每个竖条都有与渲染管道中某个阶段对应的彩色区段。 区段数因设备的 API 级别而异。
下表介绍了使用运行 Android 6.0 及更高版本的设备时分析器输出中某个竖条的每个区段。
表 1. Android 6.0 及更高版本中的竖条区段。
4.0(API 级别 14)和 5.0(API 级别 21)之间的 Android 版本具有蓝色、紫色、红色和橙色区段。 低于 4.0 的 Android 版本只有蓝色、红色和橙色区段。 下表显示的是 Android 4.0 和 5.0 中的竖条区段。
表 2. Android 4.0 及 5.0 中的竖条区段。
注: 尽管此工具名为 Profile GPU Rendering,但所有受监控的进程实际上发生在 CPU 中。 通过将命令提交到 GPU 触发渲染,GPU 异步渲染屏幕。 在某些情况下,GPU 会有太多工作要处理,在它可以提交新命令前,您的 CPU 必须等待。 在等待时,您将看到橙色条和红色条中出现峰值,且命令提交将被阻止,直到 GPU 命令队列腾出更多空间。
2. 将 GPU 过度绘制可视化
这是开发者选项中的另一个功能,通过对您的界面进行彩色编码来帮助您识别过度绘制。 当您的应用在同一帧中多次绘制相同像素时,便会发生过度绘制。 因此,此图可显示您的应用可能在何处执行太多不必要的渲染工作,这可能是 GPU 多此一举地渲染用户不可见的像素所导致的性能问题。 因此,您应尽可能修复过度绘制 Event。
如果您尚未执行此操作,请启用开发者选项。 然后,要在您的设备上可视化过度绘制问题,请执行以下操作:
1) 在您的设备上,转到 Settings 并点按 Developer Options。
2) 向下滚动到 Hardware accelerated rendering 部分,并选择 Debug GPU Overdraw。
3) 在 Debug GPU overdraw 对话框中,选择 Show overdraw areas。
Android 按如下方法为界面元素设置颜色,以便确定过度绘制的次数:
图 2. 某个应用正常时的样子(左侧),以及它在 GPU 过度绘制后的样子(右侧)
请注意,这些颜色是半透明的,因此,您在屏幕上看到的确切颜色取决于您的界面内容。现在,您可以了解您的布局中何处出现了过度绘制,请阅读如何减少过度绘制。请记住,有些过度绘制是不可避免的。 在优化您的应用的界面时,应尝试达到大部分显示真彩色或仅有 1 次过度绘制(蓝色)的视觉效果。
图 3. 大量过度绘制的应用(左侧)以及很少过度绘制的应用(右侧)的示例