摘要
面向智能手机和平板电脑的游戏是应用商店内最常见的游戏类型。 过去,移动设备的 CPU 与 GPU 非常有限,极大地影响了设备性能。 因此,大多数游戏必须设置得非常简单。 现在, CPU 与 GPU 的性能得到了显著提升,人们也开始开发更多的高端游戏。 尽管如此,移动处理 器的性能仍然低于电脑处理器。
随着移动市场的壮大,许多电脑游戏开发商开始转向为移动平台制作游戏。 然而,传统的电 脑游戏设计决策与图形资源并不适合移动处理器,也无法有效实施。 本文将以 mTricks Looting Crown 为例,介绍如何分析和提升移动游戏的性能,以及如何面向移动平台优化图形 资源。 looting crown IA 版本现已发布,具体请访问下列链接。
https://play.google.com/store/apps/details ?id=com.barunsonena.looting
图 1. mTricks Looting Crown
1. 简介
mTricks 在使用不同商业游戏引擎开发电脑游戏方面具有丰富的经验。 在规划未来项目的 同时,mTricks 预测,由于移动 CPU 与 GPU 在性能方面的显著提升,移动市场已做好准备迎 接复杂的大型多人在线角色扮演游戏 (MMORPG)。 因此,他们将针对新项目的游戏目标平台从 电脑变成移动设备。
mTricks 首先将电脑代码库移植到 Android*。 然而,目标移动平台(包括基于英特尔® 凌动™ 处理器的平台(代号“Bay Trail”))的性能比预期低得多。
与迁移至移动设备的电脑开发人员一样,mTricks 也遇到了两个问题:
- 移动处理器的处理能力较低,这意味着传统电脑图形资源和设计不适用。
- 由于移动 CPU 与 GPU 在功能和性能上的变化,游戏显示和性能也会随着不同 的目标平台而发生变化。
2. 要点概述
Looting Crown 是 SNRPG(社交网络 + RPG)类型的游戏,支持所有 3D 图形和各种多玩 家模式(PvP、PvE 和 Clan vs Clan)。mTricks 以 Bay Trail 参考设计为基础对该游戏进 行了设计和优化,具体规格请参阅表 1。
表 1. Bay Trail 参考设计规格与 3DMark 得分
Bay Trail 参考设计 10” | |
---|---|
CPU | 英特尔® 凌动™ 处理器 四核 (1.46 Ghz) |
RAM | 2GB |
分辨率 | 2560 x 1440 |
3DMark ICE Storm Unlimited 得分 | 15,094 |
显卡得分 | 13,928 |
物理技术得分 | 21,348 |
在开发过程中,mTricks 使用英特尔® 图形性能分析器(英特尔® GPA)查找 CPU 和 GPU 瓶颈,并通过分析解决图形资源和性能的问题。
基准性能为 23 fps,图 2 所示为 2 分钟运行时间内关于 GPU 利用率和目标应用 CPU 负载的统计数据。 平均 CPU 利用率约为 91%,而目标应用 CPU 负载约为 27%。
图 2. 采用英特尔® 图形性能分析 器对比基准 CPU 与 GPU 负载
3. 瓶颈存在于 CPU 还是 GPU 之中?
有两种方法可以找到 CPU 和 GPU 中的瓶颈。 一种是使用覆盖模式,另一种是改变 CPU 频率。
英特尔 GPA 系统分析器提供“禁用绘制调用” 覆写模式,以帮助开发人员 查找 CPU 或 GPU 中的瓶颈。 运行该覆写模式后,将采用覆写模式和不采用覆写模式的结果 进行比较,然后查看下列指南:
表 2. 如何采用“禁用绘制调用”覆写模式分析游戏
打开“禁用绘制调用”覆写模式后的性能改 变 | 瓶颈 |
---|---|
如果 FPS 变化不大 | 该游戏对 CPU 的依赖度较高;使用英特尔® GPA 性能分析 器或英特尔® VTune™ Amplifier 确定哪些功能耗费的时间最长 |
如果 FPS 提升 | 该游戏对 GPU 的依赖度较高;使用英特尔 GPA 帧分析器 确定哪些绘制调用耗费的时间最长 |
英特尔 GPA 系统分析器可模拟不同 CPU 设置下的应用性能,非常有利于瓶颈分析。 如要 确定应用性能是否依赖于 CPU,请进行以下操作:
- 验证您的应用不依赖于垂直同步 (Vsync)。
查看 Vsync 状态。 如果 “英特尔 GPA 系统分析器通知”面板中出现灰色高亮,则表示已启用 Vsync。
- 如果 Vsync 已禁用,继续进行第 2 步。
- 如果 Vsync 已启用,请查看“英特尔 GPA 系统分 析器”窗口右上角的帧速率。 如果帧速率在 60 FPS 左右,说明您的应用依赖 Vsync, 也无法再提高 FPS。 否则,继续进行第 2 步。
- 在“英特尔 GPA 系统分析器”窗口的“平台设置” 面板(图 3)中使用滑动器施加一个不同的 CPU 频率。 如果更改 CPU 频率后 FPS 值有所变 化,说明应用有可能依赖 CPU。
图 3. 在“平台设置”面板中改变 CPU 频率
表 3 所示为针对 Looting Crown 的模拟结果。 打开“禁用绘制调用” 覆 写模式后,FPS 保持不变。 一般情况下,这说明该游戏依赖于 CPU。 但是,“最高 CPU 频率”覆写也没有使 FPS 发生变化,这表示 Looting Crown 依赖于 GPU。 为应对这 种情况,我们返回了图 2 中的数据,图 2 显示,Bay Trail 设备上的 GPU 负载和 CPU 负 载分别为大约 91% 和 27%。 由于 GPU 瓶颈,CPU 无法得到有效利用。 我们继续进行这项计 划,首先优化 GPU 使用,然后重新测试。
表 3. 采用禁用绘制调用和最高 CPU 频率后的基准 FPS 结果
Bay Trail 设备 | FPS |
---|---|
最初 | 23 |
禁用绘制调用 | 23 |
最高 CPU 频率 | 23 |
4. 识别 GPU 瓶颈
我们发现性能瓶颈存在于 GPU 之中。 作为后续步骤,我们采用英特尔 GPA 帧分析器分析 GPU 瓶颈的成因。 图 4 显示了捕捉的关于基准帧信息。
图 4. 关于基准版本的英 特尔® GPA 帧分析器视图
4.1 将数百个静态网格合并成一个静态网格,并使用较大的纹理,以减少绘制调用数量。
表 4 和表 5 所示为英特尔 GPA 帧分析器捕捉的信息。
表 4. 所捕捉的基准帧信息
Erg 总数 | 1,726 |
总图元数 | 122,204 |
GPU 持续时间(毫秒) | 23 毫秒 |
框架显示时间(毫秒) | 48 毫秒 |
表 5. 基准版本的绘制调用成本
类型 | Erg | 时间(毫秒) | % |
---|---|---|---|
清晰 | 0 | 0.2 毫秒 | 0.5 % |
海洋 | 1 | 6 毫秒 | 13.7 % |
地形 | 2~977 | 20 毫秒 | 41.9 % |
草地 | 19~977 | 18 毫秒 | 39.0 % |
人物、建筑和效果 | 978~1676 | 19 毫秒 | 40.6 % |
UI | 1677~1725 | 1 毫秒 | 3.4 % |
“地形”的总用时为 20 毫秒,而“地形”类别中“草地 ”的总用时为 18 毫秒。 这相当于“地形”处理用时的 90%。 所以我们 对此做进一步分析,以了解“草地”处理耗时的原因。
图 5 和图 6 所示为处理“地形”和“草地”时的 erg 输 出。
图 5. 地形
图 6. “草地”纹理
Looting Crown 通过重复四次绘制小块草地来绘制地形。 因此处理“地形 ”过程中绘制调用的数量为 960。 小块草地的绘制时间很短;不过,绘制调用本身会产 生开销,所以该运行过程比较昂贵。 因此,我们推荐将数百个静态网格合并成一个静态网格,并 使用较大的纹理,以减少绘制调用数量。 更改后的结果请见表 6。
表 6. 小纹理和大纹理的绘制成本对比
小纹理(毫秒) | 18 毫秒 |
erg 数量 | 960 |
大纹理(毫秒) | 6 毫秒 |
erg 数量 | 1 |
图 7. 更改后的地形
尽管我们进行了简化,但基于拼贴的地形需要大量的绘制调用,因此减少绘制调用后,绘制 “草地”的时间节省了 12 毫秒。
4.2 优化图形资源
表 7 和表 8 所示为将大纹理应用于草地后,英特尔 GPA 帧分析器所捕捉的新信息。
表 7. 首次优化时捕捉的帧信息
Erg 总数 | 179 |
总图元数 | 27,537 |
GPU 持续时间(毫秒) | 24 毫秒 |
框架显示时间(毫秒) | 27 毫秒 |
表 8. 首次优化时的绘制调用成本
类型 | Erg | 时间(毫秒) | % |
---|---|---|---|
清晰 | 0 | 2 毫秒 | 10.4 % |
海洋 | 18 | 6 毫秒 | 23.6 % |
地形 | 1~17, 19, 23~96 | 14 毫秒 | 54.3 % |
草地 | 19 | 6 毫秒 | 23.2 % |
人物、建筑和效果 | 20~22, 97~131 | 1 毫秒 | 5.9 % |
UI | 132~178 | 1 毫秒 | 5.7 % |
我们检查游戏是否仍然依赖 GPU。 我们借助“禁用绘制调用”和“最 高 CPU 频率”模拟进行相同的测量。
表 9. 采用“禁用绘制调用”和“最高 CPU 频率”进行首次 优化后的 FPS 结果
Bay Trail 设备 | FPS |
---|---|
最初 | 40 |
禁用绘制调用 | 60 |
最高 CPU 频率 | 40 |
表 9 显示,“禁用绘制调用”模拟提高了 FPS,但“最高 CPU 频率 ”模拟没有改变 FPS。 因此,我们了解到,Looting Crown 仍然依赖于 GPU。 接着, 我们又重新检查了 CPU 负载和 GPU 利用率。
图 8. 采用英特尔® 图形性能分析 器进行首次优化后的 CPU 与 GPU 负载
图 8 显示,在 Bay Trail 设备上,GPU 负载约为 99%,而 CPU 负载约为 13%。 由于 Bay Trail 存在 CPU 瓶颈,CPU 无法支持性能加速。
Looting Crown 最初是针对电脑开发的,因此现有的图形资源不适用于 GPU 和 CPU 处 理能力较低的移动设备。 因此,我们对图形资源进行了几次优化,如下所示。
- 最大限度地减少绘制调用
- 减少材料: 对象材料的数量从 10 减至 2。
- 减少颗粒层:
- 最大限度地减少多边形
- 借助 “Simplygon” 工具应用于人物的 LOD(细节级别)。
图 9. LOD 显著减少后的人物
- 最大限度地减少用于地形的多边形: 首先,我们最大限度地 减少了针对远山(对细节要求不高)的多边形。 然后,我们最大限度地减少了针对平原(可通过两 个三角形表示)的多边形。
- 借助 “Simplygon” 工具应用于人物的 LOD(细节级别)。
- 使用优化后的光照图
- 删除针对“当日时间”的动态光。
- 最大限度地缩小每个网格的光照图尺寸: 减少用于背景的 光照图数量。
- 最大限度地减少渲染状态的变化
- 减少材料后,渲染状态和纹理的变化也减少了。
- 分离静态网格的动画部分
- Havok 引擎不支持对对象的动画部分进行部分更新。 即使 是针对对象中的静态网格部分,仅包含一个小型移动网格的对象也需要进行更新。 因此,我们 将动态部分(图 10 红色圈中的烟雾)从对象中分离出来,将其分成两个独立的对象模型。
图 10. 从静态网格中分离出来的烟雾 动画
4.3 高效使用标压缩 (Z-cull) 技术
用 3D 显卡渲染对象时,三维数据转换成二维数据 (x-y),同时 Z 缓冲器或深度缓冲器用 于保存各屏幕像素的深度信息(z 坐标)。 如果屏幕中有两个对象必须采用相同的像素进行渲染 ,GPU 将对比两个深度。 如果新对象离观测器更近,GPU 将覆写当前像素。 因此,Z 缓冲器将 准确复制常见深度感知。 标压缩过程是首先绘制最近的对象,以便较近的对象隐藏较远的对象 。 标压缩有助于提升渲染隐藏表面的性能。
在 Looting Crown 中包含两种类型的地形绘制: 海洋绘制和草地绘制。 由于大部分海洋 在草地的后面,所以许多海洋地区被隐藏起来。 然而,对海洋的渲染早于草地,因而妨碍了有效 标压缩。 图 11 和图 12 所示分别为绘制海洋和草地时的 GPU 持续时间;两者的 erg 数分 别为 18 和 19。 如果草地渲染早于海洋,之后的深度测试将表明不需要绘制海洋像素。 这样 将会缩短绘制海洋的 GPU 持续时间。 图 13 所示为第二次优化时的海洋绘制成本。 GPU 持 续时间从 6 毫秒缩短至了 0.3 毫秒。
图 11. 首次优化时的海洋绘制成本
图 12. 首次优化时的草地绘制成本
图 13. 第二次优化时的海洋绘 制成本
结果
通过这些步骤,mTricks 面向移动设备优化了所有图形资源,同时未对图形质量造成任何 影响。 Erg 数量从 1,726 减少至了 124;图元数从 122,204 减少至了 9,525。
图 14. 图形资源的变化
图 15 和表 10 所示为优化后的成效。 优化后,Bay Trail 设备的 FPS 从 23 FPS 升 至 60 FPS。
图 15. FPS 提升
表 10. 变化后的 FPS、GPU 利用率和应用 CPU 负载
基准 | 首次优 化 | 第二次 优化 | |
---|---|---|---|
FPS | 23 FPS | 45 FPS | 60 FPS |
GPU 利用率 (%) | 91% | 99% | 71% |
应用 CPU 负载 (%) | 27% | 13% | 22% |
首次优化后,Bay Trail 依然对 GPU 依赖较高。 之后我们进行了第二次优化,以通过优 化图形资源和 z 缓冲器的使用来减少 GPU 工作负载。 最终,Bay Trail 设备的 FPS 达到 了最高 (60)。 由于 Android 使用 Vsync,60 FPS 是 Android 平台所能实现的最高性能 。
结论
开始优化游戏时,您首先需要确定应用瓶颈在哪里。 英特尔 GPA 有助于通过功能强大的分 析工具实现这一目的。如果您的游戏对 CPU 依赖较高,英特尔 VTune Amplifier 将会为您 提供重大帮助。 如果您的游戏对 GPU 依赖较高,您可以使用英特尔 GPA 了解详细信息。如要 确定 GPU 瓶颈,您可以尝试寻找高效的方法减少绘制调用、多边形数量和渲染状态的变化。 您 还可以查看准确的地形纹理尺寸、动画对象、光照图,以及 z 缓冲器准确的标压缩顺序。
关于作者
Tai Ha 是一名应用工程师,主要致力于支持 APAC 领域的在线游戏。 他自 2005 年加入 英特尔公司,主要负责医疗保健、服务器、客户端和移动平台等领域的英特尔® 架构优化。 加入 英特尔公司之前,Tai 自 1999 年起供职于美国圣克拉拉市的生物计量公司,担任安全中间件 架构师。 He 毕业于韩国汉阳大学,拥有计算机科学专业学士学位。
Jackie Lee 是英特尔公司软件解决方案事业部的一名应用工程师,主要致力于基于英特 尔® 凌动™ 平台的应用性能调优。 加入英特尔公司之前,Jackie Lee 曾任职于 LG 公司的 电子 CTO 部门。 他毕业于韩国中央大学,拥有计算机科学与工程专业的学士学位与硕士学 位。
参考资料
looting crown IA 版现已在 Google Play 应用商店发布:
https://play.google.com/store/apps/details ?id=com.barunsonena.looting
英特尔® 图形性能分析器
https://software.intel.com/zh-cn/vcsource/tools/intel-gpa
Havok
http://www.havok.com
mTricks
https://www.facebook.com/mtricksgame
英特尔、Intel 标识、Atom 和凌动是英特尔公司在美国和/或其他国家(地区)的商标。
英特尔公司 © 2014 年版权所有。 所有权保留。
*其他的名称和品牌可能是其他 所有者的资产。