教程: 使用 Intel® INDE GPA 提高 Android 游戏性能





0/5 (0投票)
本教程提供了在 Android 上对 OpenGL ES 3.0 应用程序进行性能分析、瓶颈识别和渲染优化的分步指南。
英特尔® 开发人员专区提供跨平台应用开发的工具和操作方法信息、平台和技术信息、代码示例以及同行专业知识,帮助开发人员创新和成功。加入我们的Android、物联网、英特尔® 实感™ 技术和Windows社区,下载工具、访问开发工具包、与志同道合的开发人员分享想法,并参与编程马拉松、竞赛、路演和本地活动。
引言
本教程提供了在 Android* 上对 OpenGL ES* 3.0 应用程序进行性能分析、瓶颈识别和渲染优化的分步指南。名为“城市赛车”的示例应用程序模拟了在风格化城市环境中进行的公路赛车。应用程序的性能分析使用 英特尔® INDE 图形性能分析器 (Intel® INDE GPA) 工具套件完成。
城市和车辆几何形状总共包含大约 23 万个多边形(69 万个顶点),具有漫反射映射材质,由一个不投射阴影的定向光源照亮。提供的源代码材料包括构建应用程序所需的代码、项目文件和艺术资产,以及本教程中识别出的源代码优化。
致谢
本教程是 David Houlton 创建的 适用于第三代英特尔® 酷睿™ 处理器 (Ivy Bridge)(PDF)的 英特尔图形性能研讨会 的 Android 和 OpenGL ES 3.0 版本。它随 Intel INDE GPA 一起发布。
教程组织
本教程将引导您完成四个连续的优化步骤。在每个步骤中,应用程序都将使用 Intel INDE GPA 进行分析,以识别特定的性能瓶颈。然后,在应用程序中切换适当的优化以克服瓶颈,并再次对其进行分析以衡量所获得的性能。所应用的优化通常符合 英特尔® 处理器图形开发人员指南 (PDF) 中提供的指南。
在教程过程中,应用的优化将使 City Racer 的渲染性能提高 83%。
必备组件
- City Racer 示例使用 Android API 版本 20 和 Android NDK 版本 10 构建。
- 性能分析使用 Intel INDE GPA 工具套件进行。
- Intel INDE GPA 与大多数 Android 设备兼容;但是,搭载 x86 架构的 Android 设备将提供最详细的性能分析指标。
城市赛车示例应用程序
城市赛车逻辑上分为赛车模拟和渲染子组件。赛车模拟包括车辆加速、制动、转向参数建模以及赛道跟踪和碰撞避免的 AI。赛车模拟代码位于 track.cpp 和 vehicle.cpp 文件中,并且不受本教程中应用的任何优化影响。
渲染组件包括使用 OpenGL ES 3.0 和我们内部开发的 CPUT 框架绘制车辆和场景几何体。渲染代码的初始版本代表了首次尝试,其中包含几个限制性能的设计选择。
网格和纹理资产从 Media/defaultScene.scene 文件加载。单个网格被标记为预放置的场景项目、带有每个实例变换数据的实例化场景,或模拟提供变换数据的车辆。场景中有多个摄像机:一个跟踪每辆车,另一个摄像机允许用户自由探索场景。所有性能分析和代码优化都针对车辆跟随摄像机模式。
为了本教程的目的,City Racer 被设计为以暂停状态启动,这允许您使用相同的数据集完成每个分析步骤。可以通过取消选中 City Racer HUD 中的“暂停”复选框或在 CityRacer.cpp 的顶部将 g_Paused = false 设置为 false 来取消暂停 City Racer。
优化潜力
将城市赛车应用程序视为一个功能性但未经优化的原型。在其初始状态下,它提供了所需的视觉效果,但没有提供所需的渲染性能。它有许多技术和设计选择,这些选择代表了您在典型的开发中游戏中会发现的那些限制渲染性能的技术和设计选择。开发优化阶段的目标是逐一识别性能瓶颈,进行代码更改以克服它们,并衡量所实现的改进。
请注意,本教程仅涉及 City Racer 可以应用的所有可能优化的一小部分。特别是,它只考虑可以在源代码中完全应用的优化,而无需更改模型或纹理资产。此处排除了其他资产更改优化,仅仅是因为它们在教程格式中实现起来有些麻烦,但它们可以使用 Intel INDE GPA 工具识别,并且应该在实际游戏优化中考虑。
本文档中显示的性能数据是在基于英特尔® 凌动™ 处理器(代号 Bay Trail)的 Android 系统上捕获的。这些数字在您的系统上可能会有所不同,但相对性能关系应该相似,并逻辑上导致相同的性能优化。
本教程中将应用的优化可在 CityRacer.cpp 中找到。它们可以通过 City Racer 的 HUD 或通过直接修改 CityRacer.cpp 来切换。
CityRacer.cpp
bool g_Paused = true;
bool g_EnableFrustumCulling = false;
bool g_EnableBarrierInstancing = false;
bool g_EnableFastClear = false;
bool g_DisableColorBufferClear = false;
bool g_EnableSorting = false;
随着您逐步完成优化步骤,它们会逐一启用。每个变量控制一个或多个代码段的替换,以实现教程该步骤的优化。
优化教程
第一步是在 Android 设备上构建和部署 City Racer。如果您的 Android 环境设置正确,位于 CityRacer/Game/Code/Android 中的 buildandroid.bat 文件将为您执行这些步骤。
接下来,启动 Intel INDE GPA Monitor,右键单击系统托盘图标,然后选择 System Analyzer。
系统分析器将显示可连接的平台列表。选择您的 Android x86 设备,然后按“连接”。
当系统分析器连接到您的 Android 设备时,它将显示可用于分析的应用程序列表。选择 City Racer 并等待它启动。
在 City Racer 运行时,按下帧捕获按钮以捕获 GPU 帧的快照以供分析。
检查帧
打开 OpenGL* 的 Frame Analyzer,然后选择您刚刚捕获的 City Racer 帧,这将允许您详细检查 GPU 性能。
顶部的时间轴以等间距的“ergs”工作排列,每个“erg”通常对应于一个 OpenGL 绘制调用。对于更传统的时间轴显示,请在 X 和 Y 轴上选择“GPU 持续时间”。这将快速显示哪些“ergs”消耗的 GPU 时间最多,以及我们最初应该将精力集中在哪里。如果没有选择任何“ergs”,则右侧面板显示整个帧的 GPU 时间,即 55 毫秒。
优化 1 – 视锥剔除
查看所有绘制时,我们可以看到绘制了许多在屏幕上不可见的项。通过将 Y 轴更改为“剪裁后图元”,此视图中的间隙用于指出由于几何图形完全剪裁而浪费的绘制。
城市赛车中的建筑物根据空间位置组合成组。我们可以剔除不可见的组,从而消除与它们相关的 GPU 工作。通过切换“视锥剔除”复选框,每个绘制将在提交到 GPU 之前在 CPU 上运行视锥剔除例程。
打开“视锥剔除”复选框,并使用系统分析器捕获另一个帧。捕获帧后,再次在帧分析器中打开它。
通过查看此帧,我们可以看到绘制次数从 740 次减少到 576 次,减少了 22%,我们的整体 GPU 时间减少了 18%。
优化 2 – 实例化
虽然视锥剔除减少了总体工作量,但仍然有大量的小工作(以黄色突出显示),它们累积起来会占用大量的 GPU 时间。
通过检查这些工作几何形状,我们可以看到它们中的大多数是赛道两侧的混凝土障碍物。
我们可以通过将它们组合成单个实例绘制来消除这些绘制中涉及的大部分开销。通过切换“障碍物实例化”复选框,障碍物将组合成单个实例绘制,从而消除了 CPU 通过绘制向 GPU 提交每个障碍物的需要。
打开“障碍物实例化”复选框,并使用系统分析器捕获另一个帧。捕获帧后,使用帧分析器打开它。
通过查看此帧,我们可以看到绘制次数从 576 次减少到 60 次,减少了 90%。
此外,GPU 持续时间减少了 71%,降至 13 毫秒。
优化 3 – 从前到后排序
术语“过度绘制”是指多次写入每个像素;这会影响像素填充率并增加帧渲染时间。检查“写入样本”指标显示,每个像素每帧被写入大约 1.8 次(分辨率/写入样本)。
在渲染之前将绘制从前到后排序是减少过度绘制的相对简单的方法,因为 GPU 管道将拒绝任何被先前绘制遮挡的像素。
打开“从前到后排序”复选框,并使用系统分析器捕获另一个帧。捕获帧后,使用帧分析器打开它。
通过查看此帧,我们可以看到“写入样本”指标减少了 6%,我们的整体 GPU 时间减少了 8%。
优化 4 – 快速清除
最后查看我们的绘制时间显示,第一个 erg 占用了最长的单个 GPU 时间。选择此 erg 会发现它不是绘制调用,而是一个 glClear 调用。
英特尔的 GPU 硬件具有一种优化路径,可以以传统清除所需时间的一小部分执行“快速清除”。通过将 glClearColor 设置为全黑或全白(0, 0, 0, 0 或 1, 1, 1, 1)可以执行快速清除。
打开“快速清除”复选框,并使用系统分析器捕获另一个帧。捕获帧后,使用帧分析器打开它。
通过查看此帧,我们可以看到清除的 GPU 持续时间比常规清除减少了 87%,从 1.2 毫秒降至 0.2 毫秒。
因此,GPU 的整体帧持续时间减少了 24%,降至 9.2 毫秒。
结论
本教程以一个具有代表性的早期游戏应用程序为例,并使用 Intel INDE GPA 分析应用程序行为,并进行有针对性的更改以提高性能。所做的更改和实现的改进如下:
优化 | 以前 | 操作后 | 改善百分比 |
视锥剔除 | 55.2 毫秒 | 45.0 毫秒 | 82% |
实例化 | 45.0 毫秒 | 13.2 毫秒 | 71% |
排序 | 13.2 毫秒 | 12.1 毫秒 | 8% |
快速清除 | 12.1 毫秒 | 9.2 毫秒 | 24% |
整体 GPU 优化 | 55.2 毫秒 | 9.2 毫秒 | 83% |
性能测试中使用的软件和工作负载可能仅针对英特尔微处理器进行了性能优化。性能测试,例如 SYSmark* 和 MobileMark*,使用特定的计算机系统、组件、软件、操作和功能进行测量。任何这些因素的改变都可能导致结果有所不同。您应该查阅其他信息和性能测试,以帮助您全面评估您考虑的购买,包括该产品与其他产品组合时的性能。欲了解更多信息,请访问 http://www.intel.com/performance。
总的来说,从 City Racer 的初始实现到最佳优化版本,我们展示了渲染性能提高了 300%,从 11 fps 提高到 44 fps。由于此实现一开始就明显不理想,因此采用这些技术的开发人员在实际游戏中可能不会看到相同的绝对性能提升。
尽管如此,本教程的主要目标不是优化这个特定的示例应用程序,而是通过遵循《英特尔处理器图形开发人员指南》中的建议以及 Intel INDE GPA 在查找和衡量这些改进方面的实用性所能发现的潜在性能增益。