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

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

2015年10月30日

CPOL

8分钟阅读

viewsIcon

8894

本文将展示 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® 架构上提高性能的一些技巧。

图 1. 《Hero Sky: Epic Guild Wars》

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 代码的性能对比。

图 2. 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 进行深度分析

图 3 基线版本的屏幕截图

移植后,游戏显示为 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”选项卡中。

图 4. 如何在 Graphics Frame Analyzer 中无需修改源代码即可实验启用/禁用 alpha 混合。

下表显示了禁用 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 剔除。

图 5. 天空(erg 1)和草地(erg5)的绘制调用

下图是更改绘制顺序后天空的 GPU 持续时间。

图 6. 在 Graphics Frame Analyzer 中更改天空绘制顺序后的结果。

下表显示了更改绘制顺序后天空的更详细信息,草地的 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 混合并更改绘制顺序(天空)后的性能提升

 

图 7. 优化 x86 原生支持后的性能提升

结论

在开始优化 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

© . All rights reserved.