65.9K
CodeProject 正在变化。 阅读更多。
Home

使用Intel GPA在Android游戏和应用程序中查找性能瓶颈

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2013 年 11 月 22 日

CPOL

9分钟阅读

viewsIcon

20160

本文将介绍使用 Intel 的图形性能分析器 (Graphics Performance Analyzers) 来调试和评估基于 Android 的游戏和应用的性能热点。

引言

本文将介绍使用 Intel 的图形性能分析器 来调试和评估基于 Android 的游戏和应用的性能热点。文章将概述该工具,并通过一款来自应用商店的实时 3D 游戏进行实际使用,以检测其当前实际存在的性能瓶颈。本文的出发点是鼓励您使用性能分析工具来有条理地针对代码进行优化,而不是盲目地尝试优化代码。

Intel GPA  

Intel 的图形性能分析器 (Intel’s Graphics Performance Analyzer) 是一套工具集,可让您分析桌面和基于 Android 的应用程序。在本文中,我们将安装并在 Mac 上运行该工具的 Android 版本。

安装 (http://software.intel.com/en-us/vcsource/tools/intel-gpa

下载该工具的 Android 版本,解压,然后运行 System Analyzer.dmg 安装程序。

运行 Intel GPA 系统分析器 (Intel GPA System Analyzer)

首次运行该应用程序时,您将看到一个屏幕,允许您输入 IP 地址或连接到任何自动检测到的 Android 设备(请注意,Intel GPA 系统分析器只能分析基于 Intel 架构的 Android 设备;在此教程中,我使用的是三星 Galaxy Tab3)。

连接成功后,您将看到设备上已安装的应用程序列表,可以选择在分析模式下运行这些应用程序。

现在,只需选择您要分析的应用程序,该应用程序将自动启动,分析也将随之开始。

一旦 Intel GPA 工具运行起来,您会立即看到一系列性能指标和可供您尝试的覆盖选项。

指标

CPU

在 CPU 子分组中,您可以查看每个独立 CPU 的性能负载,但更有用的是聚合和目标应用程序 CPU 负载。通过将这两个指标拖到右侧面板,您可以查看您的应用程序与整个系统使用率相比占用了多少 CPU,从而能够检测到任何性能问题是否由后台操作引起。

设备 I/O

在设备 I/O 子分组中,您可以查看磁盘和网络活动,这可以快速指示您的应用程序性能是否受到 I/O 操作的影响。

GPU

GPU 子部分直接为您提供 GPU 实际负载的指标,包括瓦片操作 (tiling operations) 的指标、每秒顶点数 (verticies per second) 以及纹理和着色器处理负载。

  • TA 负载和 USSE 顶点负载:TA 负载指示瓦片加速器 (Tile Accelerator) 的使用时间。USSE 顶点负载指示着色器引擎处理顶点指令的百分比时间。理想情况下,这些负载应该平衡以获得最佳性能。但是,如果顶点负载低而 TA 负载高,则意味着场景过于复杂。另一方面,如果顶点负载高而 TA 负载低,则意味着应该针对顶点着色器进行优化。
  • PB 基元/秒:如果此值很高,则表明您的瓶颈是顶点格式大小。
  • PB 顶点/秒:如果此值很高,则值得检查您在顶点着色器和片段着色器之间传递的顶点数据量。
  • PB 顶点/基元:如果此值很高,则值得考虑降低模型的 LOD 或使用索引缓冲区共享顶点。
  • ISP 负载:图像合成处理器 (Image Synthesis Processor) 负责隐藏表面消除,如果此指标很高,则值得考虑实现软件剔除技术或对您的绘制调用进行排序。如果 Z 缓冲区用于管理多个渲染目标,也值得检查一下,如果是这样,则为每个渲染目标创建一个 Z 缓冲区。
  • TSP 负载、纹理单元负载和 USSE 像素负载:TSP 指标为您提供纹理和着色器处理器 (Texture and Shading processor) 繁忙时间的百分比。纹理单元负载 (Texture Unit Load) 告诉您纹理单元有多忙,而 USSE 像素负载 (USSE Pixel Load) 告诉您着色器单元处理像素指令的时间。结合使用这些指标将有助于您评估需要优化哪个区域。如果您的 TSP 负载很高,通过查看纹理单元负载和 USSE 像素负载,您可以推断出负载是由于纹理还是着色器复杂性引起的。如果纹理单元负载很高,那么通过使用压缩或降低分辨率来优化您的纹理类型是值得的。但是,如果 USSE 像素负载很高,那么则值得调查片段着色器的复杂性。
  • USSE 总负载:指示着色器单元使用时间的百分比。结合像素和顶点负载使用,可以推断出哪个区域是瓶颈。
  • USSE 每个顶点/周期、每个像素/周期和停滞负载:为您提供片段和顶点着色器处理效率的即时统计数据。

内存

内存子部分为您提供应用程序内存使用情况和可用系统内存的即时概览。这可以是一个非常快速且有用的检查,用于查找应用程序内存泄漏,或者您的性能问题是否与可用系统内存不足有关。

OpenGL

此子部分为您提供 3D 应用程序和游戏的非常有用的指标,可即时访问 FPS 计数、帧时间、缓冲区创建次数、绘制调用次数和状态更改次数。

在此逐一解释这些指标的最佳方法是

  • 绘制调用和索引绘制调用:在 3D 图形世界中,绘制调用通常是一项昂贵的操作。通过查看此指标,您可以决定每帧的调用次数是否过多,是否需要将顶点压缩到一个绘制调用中。
  • 顶点数和索引顶点数:为您提供正在处理的顶点数量的即时统计数据。
  • FPS 和帧时间:至关重要的每秒帧数指标,任何低于 60fps 或高于 16 毫秒帧时间的值都意味着不再流畅。
  • 缓冲区创建:根据您的应用程序,缓冲区创建应该发生在设置阶段,因为它们往往是慢操作。如果您发现您在运行时创建缓冲区,这意味着很可能有一个区域可以优化。
  • 错误获取:另一个慢速但有助于调试的操作,您应该真正以 0 为目标。
  • 状态指标:此部分为您提供有关状态更改数量的即时指标,无论是总数,还是单独的纹理/着色器/缓冲区更改。如果您发现 GPU 受到限制,那么减少状态更改(例如通过批处理相似的绘制调用)将是一个建议的方向。

此子部分为您提供电池的即时统计数据。虽然它对性能不是非常有用的,但了解您的设备还是很有趣的。

状态覆盖

状态覆盖子部分为您提供了一系列实时实验,您可以在其中测试性能瓶颈的原因。

1x1 剪刀矩形和简单片段着色器

1x1 剪刀矩形禁用像素渲染,而简单片段着色器用简单的颜色输出来替换您当前的片段着色器。这两个覆盖都可以让您测试您的应用程序是否受片段着色器限制。如果性能没有提高,那么最好不要尝试优化任何片段着色器,而是检查您的顶点计数和绘制调用。

禁用 alpha 混合

对于像游戏这样图形密集型的应用程序,透明度操作往往是最大的性能杀手。通过使用此测试,您可以快速了解禁用透明度对应用程序性能的影响。

禁用绘制调用

一个非常简单但有用的覆盖选项,让您可以检查您的应用程序是否进行了过多的绘制调用。如果是这样,您应该考虑将这些调用的顶点数据批处理到一个(可能的情况下)。

禁用 Z 测试

Z 缓冲区通常用于裁剪在其他对象后面绘制的对象。运行此覆盖应该会降低渲染速度,如果不会,则意味着您可能以从后到前的顺序绘制了太多对象,这使得渲染器不断地在背景对象之上渲染新对象。通过实现从前到后的排序或手动遮挡代码,可以提高帧速率。

显示线框

此覆盖选项以线框模式显示您的渲染,这有助于您调试网格的外观以及它们在场景中的布局方式。

纹理 2x2

此覆盖选项为您提供了一个简单快捷的测试,以找出您的应用程序是否受纹理限制。如果您启用此覆盖选项后,应用程序的性能有所提高,那么您应该尝试优化您的纹理。这可以通过减少纹理数量、降低纹理分辨率、更改纹理过滤设置或更改纹理在着色器中的使用方式来实现。

用例:查找应用程序中的性能瓶颈

我们将要测试的应用程序名为 PLAYIR;它是一款 3D 多人游戏设计应用程序,允许您使用拖放式用户体验和实时源代码编辑,在移动和 Web 设备上创建和发布游戏。在此用例中,我们将加载其中的一个游戏,名为 World of Fighters,并尝试研究在游戏中引入更多角色如何影响我们的性能瓶颈。

在默认的游戏场景中,有几棵树和两个角色在关卡中游荡。如果我们使用 GPA 工具检查我们的应用程序,我们可以看到帧率约为 60fps。

现在,当我们把敌人的数量增加到 50 个时,帧率下降到 8。

如果不使用分析工具,我们首先可能会认为帧率下降是由于屏幕上需要绘制更多角色,然后我们就会开始过早地优化渲染管线。

然而,如果我们通过启用 1x1 剪刀矩形和禁用绘制调用状态覆盖来实际测试此假设。

我们注意到,实际上帧率保持不变。这意味着优化任何渲染都不会带来实际的性能提升。相反,我们的应用程序受 CPU 限制,我们应该转而调查代码的其他区域(例如 AI 或物理子程序)。

总结

希望通过本指南,您现在应该会受到启发,至少使用 Intel GPA 工具 来启动您的应用程序,并查看一些指标。无论是简单地检查您的内存和电池使用情况,还是深入了解并找出您实际的性能瓶颈,正如我们在 PLAYIR 的案例中所做的那样。在 3D 图形世界中,很容易假设绘制更多东西意味着性能下降。但首先验证您的假设总是一个好主意,因为您可能会发现将时间花在优化代码的其他区域会更有效。

要详细了解 Intel 的 Android 开发工具,请访问 Intel® Android 开发者专区

其他相关文章

要详细了解 Intel 的 Android 开发工具,请访问 Intel® Android 开发者专区

© . All rights reserved.