移动应用在模拟器和设备之间有着不同的行为,随着应用越来越复杂,调试性能瓶颈变得非常困难。 英特尔® INDE 的组件 GPA System Analyzer 是一款能够诊断各种性能问题的工具。
安装英特尔® 集成式本机开发人员体验测试版(英特尔® INDE)
英特尔 INDE 可为在基于英特尔® 架构的设备上设置环境、创建代码、编译、调试和分析提供一套完整、一致的 C++/Java* 工具、库和示例,并可为基于 ARM* 的 Android* 设备提供指定功能。
通过以下链接安装英特尔 INDE: http://software.intel.com/en-us/intel-inde
针对远程调试构建应用
为了允许 GPA System Analyzer 连接您的应用,您需要确保它有 INTERNET许可且 debuggable设置为 “真(true)”。
了解应用
Art Browser 样本应用是一个基本样本,它融合了大型实际应用的某些方面。 它是一个极为简单的图像滚动插件(image carousel),您可能会在媒体播放器或图片浏览应用中看到。 它有两个按钮您不会在产品应用中看到,这两个按钮对于解决性能问题非常有帮助:
- 启用和禁用 “Advanced Math Calculations” 的按钮。 这模拟了一些真实状况,即需要选择使用高级的 CPU 密集型物理引擎、极为冗长的记录、重负载位图效果或其他 CPU 密集型特性,它们对应用是否成功不起关键作用。 该按钮在启用状态下回通过使 CPU 过载来显著降低应用的速度,从而为我们提供机会了解如何调试占用大量 CPU 资源的应用。 默认情况下,该按钮为禁用状态,以便允许应用顺利加载。
- 选择几何复杂性的下拉菜单。 通常情况下,最好将大型平面划分为较小的方块以避免深度分类的问题。 默认值是 128x128 网格,这比基本需求复杂,但是可以帮助解释我们的观点。 此几何复杂性将会使 GPU 过载,并为我们提供一个机会了解占用大量 GPU 的应用在 GPA 中的情况。 将其减少到任意更低的值将会让应用恢复顺畅运行。
连接到您的应用上
在您的设备或模拟器上构建和安装 Art Browser 示例应用。 然后,确保您的 Android 开发工具(Eclipse 等)没有运行,因为这可能会导致无法连接到您应用上。 启动 GPA System Analyzer 工具。 它将会列出您的本地设备以及任何运行中的模拟器或添加的设备。
确保您的设备或模拟器没有锁定,且启用了“USB 调试”。 点击“连接”按钮将其连接。 GPA 将会列出所有启用了调试的应用。
GPA 能够监控多种数据类型,但是对于此应用,我们对帧速率和 CPU 加载最有兴趣。 将 CPU → Aggregated CPU Load 从左侧侧栏拖至上方的图表,将 OpenGL → FPS 拖至下方的图表。
优化代码
为了演示 CPU 密集使用的情况,我们需要通过该应用中的按钮启用 Complex Math Calculation。 我们可以立刻看到它正在消耗 100% 的处理器。 这解释了帧速率为何为 0 FPS。 再次点击该按钮关闭重负载运算能够稍微改善一下此状况,使 CPU 总负载下降 30%,并使 FPS 上升至略微可用的值 — 10。
优化 OpenGL
我们仅禁用了 CPU 密集型代码片段,但是我们的性能仍然较差。 我们现在唯一能做的是优化 OpenGL 渲染。 突破图形瓶颈比 CPU 瓶颈要难,因为 OpenGL 图形管线是一个复杂的流程,解决一个问题没有一成不变的单一标准。 所幸,GPA 配备了丰富的 OpenGL 优化工具,这些工具由许多能够关闭或更换 OpenGL 渲染管线组件的复选框构成。
确定您的应用是否为 GPU 密集型且有 OpenGL 瓶颈的最简单的方法是使用“禁用绘制调用(Disable Draw Calls)”状态覆盖。 这将会关闭发送到 GPU 的所有操作。 如果使用该覆盖无法改善性能,我们便知道问题与 CPU 有关。 但是,如果 FPS 显著攀升,我们肯定会有 OpenGL 瓶颈。
如您所见,它导致 FPS 图表迅速上涨,因此我们知道我们的应用是 GPU 密集型。 我们可以看到是否高分辨率纹理可能通过禁用所有状态覆盖,然后使用 Texture 2x2 覆盖导致了问题的出现。
这带来的变化很小。 然后,我们可以尝试使用 Simple Fragment Shader 覆盖观察着色器代码是否太复杂。
我们要了解的不是改善了多少。 我们可以通过比较 TA Load 标准和 USSE Vertex Load 标准来测试过度复杂的几何。 将 GPU → TA Load 标准拖至上方图表,然后按 CTRL 并将 GPU → USSE Vertex Load 标准也拖至上方图表,在 TA Load 旁边用曲线图来表示它。 可能与您预计的情况相反,高 TA Load 和低 Vertex Load 代表处理了太多顶点。
很明显,这是一个问题,因为 TA Load 数量级更高。 但是,请注意,它仍然在 50% 以下徘徊。 还需注意,即使严重的图形瓶颈也无法使任何一个标准达到 100%。
使用我们应用中的 Geometry Complexity spinner,我们可以将自己的几何简化为 2x2 网格。
这可以即可加速 FPS,而且 TA Load 与 USSE Vertex Load 也更平衡。 如果我们希望找到性能和深度分类之间的平衡点,还可以尝试 8x8 和 32x32。 现在,此应用可以闪亮登场!
注: 应用的测试以及结果的分析基于英特尔凌动处理器 Z2760 平板电脑。
结论
虽然性能问题很难在商务级别的应用上进行调试,但是 GPA System Analyzer 能够在调查复杂的性能瓶颈上提供有力的支持。 如欲更多信息和完整文档,请查看 Intel.com 上的 GPA System Analyzer 主页。