为 Intel® 架构优化 Android OS 上的 Unity 游戏:案例研究





0/5 (0投票)
本文将展示 Android 原生支持带来的性能提升,并以《Hero Sky: Epic Guild Wars》为例,分享在 Intel® 架构上提高性能的一些技巧。
Intel® Developer Zone 提供跨平台应用开发工具和操作指南、平台和技术信息、代码示例以及同行专业知识,以帮助开发者创新并取得成功。加入我们的社区,了解 Android、物联网、Intel® RealSense™ 技术 和 Windows,下载工具,获取开发套件,与志同道合的开发者分享想法,并参与黑客松、竞赛、路演和本地活动。
Unity* 是移动环境(Android* 和 iOS*)中最受欢迎的游戏引擎之一,许多开发者都使用它来开发和发布游戏。在 Unity 支持 Intel 平台上的 Android 之前,游戏是在模拟器上执行的,该模拟器将 ARM* 原生代码转换为 Intel 原生代码。一些在 Intel 平台上运行的非原生 x86 游戏根本无法运行,另一些则存在性能问题。随着 Intel 处理器在移动市场份额的增长,许多开发者现在对支持 x86 架构上的 Android 感兴趣,并希望了解如何优化他们的游戏。
本文将展示 Android 原生支持带来的性能提升,并以《Hero Sky: Epic Guild Wars》为例,分享在 Intel® 架构上提高性能的一些技巧。
Innospark 是《Hero Sky: Epic Guild Wars》的开发商,在移动游戏开发方面拥有丰富的经验,曾使用多种商业游戏引擎,并拥有自己的内部游戏引擎。《Hero Sky: Epic Guild Wars》是他们推出的首款基于 Unity 的面向全球市场的游戏。随着 Google Play* 商店下载量的不断增加,公司开始收到用户反馈,称游戏在某些搭载 Intel 处理器设备的 Android 上无法运行或出现卡顿。因此,Innospark 决定将游戏移植并优化到 Intel 架构的 Android OS 上。本文将介绍 Innospark 所做的优化工作,以及使用 Intel® Graphics Performance Analyzers (Intel® GPA) 进行性能分析的结果,例如更改绘制顺序和移除不必要的 alpha 混合。
引言
《Hero Sky: Epic Guild Wars》是一款在线战斗策略类游戏,支持全 3D 图形。Innospark 在基于 Intel® Atom™ 处理器(代号为 Bay Trail)的平台上开发并优化了该游戏。Bay Trail 的参考设计和规格如下所示。
CPU |
Intel® Atom™ 处理器 四核 1.46 GHz |
---|---|
操作系统 |
Android* 4.4.4 |
RAM |
2GB |
分辨率 |
1920x1200 |
3DMark* ICE Storm Unlimited 分数 |
10,386 |
图形分数 |
9,274 |
物理分数 |
17,899 |
表 1. Bay Trail 8 英寸参考设计规格和 3DMark* 分数
下图展示了在 Bay Trail 参考设计上,非原生 x86 代码与原生 x86 代码的性能对比。
用于性能测试的软件和工作负载可能仅针对 Intel 微处理器进行了性能优化。性能测试,如 SYSmark* 和 MobileMark*,是通过特定的计算机系统、组件、软件、操作和功能来衡量的。对其中任何一个因素的更改都可能导致结果有所不同。您应该参考其他信息和性能测试,以帮助您全面评估您打算购买的产品,包括该产品与其他产品结合使用时的性能。有关更多信息,请访问 http://www.intel.com/performance。
将游戏移植到 Intel 架构的 Android 后,CPU 负载降低了约 7.1%,FPS 提高了约 27.8%,执行时间缩短了约 32.6%。然而,由于 FPS 提高,GPU 忙碌度增加了约 26.7%。
Innospark 在开发过程中使用 Intel GPA 来查找 CPU 和 GPU 的瓶颈,并利用分析结果来解决图形问题和提高性能。
Intel GPA System Analyzer 将基线性能测量为 59.01 FPS。Graphics Frame Analyzer 仅测量 GPU 侧的 FPS,测量结果为 120.9 FPS。FPS 不同的原因是 System Analyzer 监控进程的实时活动,包括 CPU 和 GPU 的工作,而 Graphics Frame Analyzer 包括与数据提交给驱动程序和 GPU 直接相关的 CPU 活动以及 GPU 相关的工作。
使用 Graphics Frame Analyzer 进行深度分析
移植后,游戏显示为 59.01 FPS。我们使用 Graphics Frame Analyzer 对其进行了更详细的分析,以降低 GPU 忙碌度和 CPU 负载。下表显示了使用 Graphics Frame Analyzer 捕获的信息。
总图元计数 |
4,376 |
---|---|
GPU 持续时间,毫秒 |
8.56 毫秒 |
显示帧的时间,毫秒 |
9.35 毫秒 |
表 2. 基线帧信息
类型 |
Erg |
GPU 持续时间 (毫秒) |
GPU 内存读取 (MB) |
GPU 内存写入 (MB) |
---|---|---|---|---|
天空 |
1 |
1.43 毫秒 |
0.2 MB |
7.6 MB |
地形 |
5 |
1.89 毫秒 |
9.4 MB |
8.2 MB |
表 3. 基线版本的高绘制调用成本
分析和优化高绘制调用
移除不必要的 alpha 混合
当显示对象使用 alpha 混合时,运行时必须将每个堆叠的显示对象和背景颜色的值合并,以确定最终颜色。因此,alpha 混合比绘制不透明颜色更耗费处理器资源。这种额外的计算可能会降低低端设备的性能。因此,我们需要移除不必要的 alpha 混合。
Graphics Frame Analyzer 可以启用或禁用每个绘制调用,以便开发者无需修改源代码即可进行测试和测量。此功能位于“State”选项卡下的“Blend State”选项卡中。
下表显示了禁用 alpha 混合后关于草的绘制调用的更详细信息,草的 GPU 持续时间减少了约 26.0%。还请注意,GPU 内存读取减少了约 97.2%。
|
基线 |
更改绘制顺序(天空) |
---|---|---|
GPU 时钟 |
1,466,843 |
1,085,794.5 |
GPU 持续时间,微秒 |
1,896.6 微秒 |
1,398.4 微秒 |
GPU 内存读取,MB |
7.6 MB |
0.2 MB |
GPU 内存写入,MB |
8.2 MB |
8.2 MB |
表 4. 禁用 alpha 混合后绘制调用的详细信息
高效应用 Z 剔除
当 3D 图形卡渲染对象时,3D 数据被转换为 2D 数据 (x-y),Z 缓冲区或深度缓冲区用于存储每个屏幕像素的深度信息(z 坐标)。如果场景中的两个对象必须在同一像素上渲染,GPU 会比较两个深度,如果新对象更靠近观察者,则会覆盖当前像素。Z 剔除过程通过首先绘制最接近的对象来正确再现通常的深度感知,从而使较近的对象隐藏较远的对象。Z 剔除在渲染隐藏表面时提供性能改进。
游戏有两种地形绘制:天空和草地绘制。Erg 1 绘制调用用于天空,Erg 5 是用于草地的绘制调用。由于大部分天空区域位于草地后面,因此在游戏过程中,许多天空区域从未显示出来。然而,天空的渲染顺序早于草地,这妨碍了有效的 Z 剔除。
下图是更改绘制顺序后天空的 GPU 持续时间。
下表显示了更改绘制顺序后天空的更详细信息,草地的 GPU 持续时间减少了约 88.0%。请注意,GPU 内存写入减少了约 98.9%。
|
基线 |
更改绘制顺序(天空) |
---|---|---|
GPU 时钟 |
1,113,276 |
133,975 |
GPU 持续时间,微秒 |
1,433 微秒 |
174.2 微秒 |
早期 Z 失败 |
0 |
2,145,344 |
写入样本 |
2,165,760 |
20,416 |
GPU 内存读取,MB |
0.2 MB |
0.0 MB |
GPU 内存写入,MB |
9.4 MB |
0.1 MB |
表 5. 更改绘制顺序(天空)后绘制调用的详细信息
结果
下表显示了在移除不必要的 alpha 混合和更改绘制顺序后 x86 优化的更详细数据。GPU 持续时间减少了约 25%,GPU 内存读取/写入分别减少了约 42.6% 和 30.0%。System Analyzer 显示 FPS 仅增加了 1.06,因为 Android 使用 vsync 模式,最大 FPS 为 60 fps,但 Graphics Frame Analyzer 上的 FPS 增加了约 29.7%。
|
X86 基线 |
X86 优化 |
---|---|---|
GPU 时钟 |
6,654,210 |
4,965,478 |
GPU 持续时间,微秒 |
8,565.2 微秒 |
6,386 微秒 |
早期 Z 失败 |
16,592 |
2,248,450 |
写入样本 |
6,053,311 |
2,813,997 |
GPU 内存读取,MB |
20.9 MB |
12.0 MB |
GPU 内存写入,MB |
28.6 MB |
20.0 MB |
System Analyzer 上的 FPS |
59.01 |
60.07 |
Graphics Frame Analyzer 上的 FPS |
120.9 |
156.8 |
表 6. 禁用 alpha 混合并更改绘制顺序(天空)后的性能提升
结论
在开始优化 Android x86 上的游戏时,开发者首先应将游戏移植到 Android x86,然后确定应用程序的瓶颈所在。性能分析工具可以帮助您衡量性能,并更轻松地查看 GPU 方面的性能问题。Intel GPA 强大的分析工具可以提供无需修改源代码即可进行实验的能力。
关于作者
Jackie Lee 是 Intel 软件解决方案组的应用工程师,专注于 Intel Atom 平台上的应用性能调优。在加入 Intel 之前,Jackie Lee 曾在 LG 的电子 CTO 部门工作。他拥有中央大学计算机科学与工程学硕士和学士学位。
参考文献
Intel® Graphics Performance Analyzers
https://software.intel.com/en-us/gpa
Innospark
http://www.innospark.com/#!home-en/c1vtc
Hero Sky: Epic Guild Wars
https://play.google.com/store/apps/details?id=com.innospark.herosky
Unity
http://unity3d.com
Unity 原生 X86 支持为 Square Enix 的热门游戏 Hitman GO* 增色不少
https://software.intel.com/en-us/articles/unity-native-x86-support-shines-for-square-enix-s-hitman-go