Icy Rocks Workload:Android 平台的真实工作负载





5.00/5 (1投票)
Icy Rocks Workload:Android 平台的真实工作负载
Intel® Developer Zone 提供跨平台应用开发工具和操作指南、平台和技术信息、代码示例以及同行专业知识,帮助开发者创新并取得成功。加入我们的 Android、物联网、Intel® RealSense™ 技术 和 Windows 社区,下载工具,访问开发套件,与志同道合的开发者交流想法,并参与黑客松、竞赛、路演和本地活动。
Android 平台基准测试及其与用户体验的相关性
Android 操作系统虽然拥有超过十亿用户,但与 Windows\*、Linux\* 和 OSX\* 相比,它还相对较新。与任何新系统一样,其工作原理以及如何改进它通常并不清楚。此外,用户的行为变化迅速且剧烈,而且这种趋势没有减缓的迹象。
为了提供最佳的用户体验,工程师们会创建用例,也称为工作负载,以模拟真实用户如何使用系统,但它们本身并不是实际的应用程序。工程师可以使用这些工作负载来测量和改进 Android 系统组件的性能。
不幸的是,Android 平台可用的真实世界工作负载很少。因此,“不真实”和/或“琐碎”的合成工作负载(如 CaffeineMark\*)驱动设备之间的比较,并严重影响公众手中最终会有哪些设备。这些工作负载无法告诉我们真实用户是否会偏爱一台设备而不是另一台,因为它们并未测量设备实际使用情况的任何方面。虽然优化这些工作负载可能会带来设计上的成功,但对最终用户来说并没有带来任何愉悦。
Icy Rocks Workload 概述
大多数 Android Java\* 工作负载试图衡量以下两个方面之一。一些侧重于有限的机器功能集,旨在突出片上系统(SoC)中的特定组件或组件集。另一些则不那么偏向于特定的机器功能,而只包含几个 Java 方法。两者都是合成的,并且与应用程序开发者通常生成的代码所做的事情不同。
Android 执行栈很复杂,因此 Android 性能分析师应将重点从这些旧的工作负载转移到新的工作负载上,后者能更准确地反映 Android 最终用户的活动。为了提供对运行时用户可感知的改进,我们需要能够反映运行时和系统级交互真实特征的工作负载。
Icy Rocks Workload 是 Intel 开发的一种动画工作负载,模仿 Android 平台上的真实游戏应用。它使用了开源的 JBox2D\* 物理引擎和 Cocos2D\* 图形引擎,两者都用 Java 编写。Cocos2D 渲染由 OpenGL\* 处理。Icy Rocks Workload 中所有对象的运动都由 JBox2D 模拟。它模拟了物理游戏世界并负责世界更新。
Icy Rocks Workload 包含多项指标。它收集每秒帧数 (FPS) 的平均值,通常用于衡量动画帧的流畅度,以及每秒动画数 (APS),它衡量物理引擎的计算速率。其他指标包括平均帧更新时间和卡顿。最终统计数据会显示在屏幕上并保存在设备上的日志文件中。
游戏模拟
Icy Rocks Workload 的主要界面是一个场景,其中有许多精灵,如岩石、雪花、雪人、投石器。投石器向雪人投掷岩石,同时岩石和雪花像雨一样落入它们之间的山谷。山谷底部有一个旋转的搅拌器,在搅动一切。通过添加岩石和雪花来逐渐增加游戏负载。
Icy Rocks Workload 有两种不同的模式:演示模式和基准测试模式。在演示模式下,用户可以通过每次触摸来添加岩石和雪花。在基准测试模式下,工作负载会自动运行。每 20 秒以 2:5 的比例添加岩石和雪花,并禁用屏幕触摸。进行五次运行后即可获得测量摘要。
Android 平台、Java 和原生 Icy Rocks Workload
Icy Rocks Workload 有三个不同的变体,分别适用于 Android 平台、Oracle Java (JDK 8) 和原生 C++。所有变体中的工作负载动画外观相似。有两种运行模式:演示模式和基准测试模式。演示模式持续运行,而基准测试模式运行约 11 分钟。Android 平台的 Icy Rocks Workload 是参考实现。Java 的 Icy Rocks Workload 可以在安装了 Java 8 的任何 Linux PC 上运行。原生的 Icy Rocks Workload 使用 Box2D 和 Cocos2D-X 的 C++ 版本。
Android 平台和 Java 的 Icy Rocks Workload 都可以以图形模式或 CPU (非 GL) 模式运行。CPU 模式也称为 Kernel 的 Icy Rocks Workload,用于了解物理引擎的独立性能。
如何运行 Icy Rocks Workload
Android 平台的 Icy Rocks Workload 以一个包的形式提供:GameWorkload.apk。安装 GameWorkload.apk 后,用户点击 gameworkload 启动器的图标,然后选择“运行基准测试”或“演示模式”。“运行基准测试”是自动化的,完成后会在屏幕上报告最终分数。“演示模式”支持用户交互。
游戏基准测试时间线
在典型的真实 Android 游戏中,随着用户进入更高的关卡并获得更多分数,游戏的复杂性会增加。在 Icy Rocks Workload 中,我们通过添加更多岩石和雪花来轻松增加负载,如下图所示。
在 Android 应用程序中,FPS 是衡量用户体验流畅度的指标。Icy Rocks Workload 在各种负载级别下测量其每秒可渲染的平均帧数 (FPS),然后通过计算各种负载级别下的 FPS 的几何平均值来计算最终指标。该工作负载还测量每秒丢帧率,通常称为卡顿。Icy Rocks Workload 在动画的各个点测量每秒卡顿数 (JPS)。
Android 手机游戏的典型持续时间约为 10 分钟,因此该工作负载设计为运行约 11 分钟。此时间框架还包括两个不同游戏配置之间 10 秒的设备预热时间。
每次运行报告以下指标
- 每秒动画数
- 帧率 (FPS)
- 每秒屏幕更新时间(帧)
- 卡顿(在 Java 世界中,“卡顿”意味着屏幕动画不流畅,看起来跳跃)
完成后,将计算这五次运行数据的几何平均值作为附加指标。
运行摘要将与此屏幕截图类似。
典型游戏工作流
Android (Java) 的 Cocos2D 工作流
在使用 Android 平台的 Cocos2D 时,游戏通常通过主循环进行编程。因此,典型游戏工作流类似于上图:它由一个循环的主循环定义:检查用户是否与设备交互,处理游戏逻辑(例如移动对象),准备动画和 GL 命令,最后绘制帧。
与所有工作负载一样,需要提供指标。对于 Icy Rocks Workload,各种计算出的指标是 FPS、APS 和 JPS。
JBox2d 工作流
JBox2D 是一个二维刚体仿真库。程序员可以使用它使对象以逼真的方式移动。在 Icy Rocks Workload 中,JBox2D 作为 Cocos2D 中的游戏逻辑部分工作。
游戏通常选择 1/60 秒作为世界步长间隔。对于该工作负载,JBox2D 在 Cocos2D 中用于处理应用程序的物理部分。
它首先定义世界中的所有对象并设置事件监听器。然后,它从物理引擎的角度初始化世界并开始准备其回调。在世界的每一步,基本上当主循环调用它进行更新时,JBox2D 引擎会更新它跟踪的对象的位置和速度。
游戏线程
一个通用的游戏应用程序包含两个线程:主线程和渲染器线程。主线程初始化应用程序和游戏场景,然后运行主循环。渲染器线程在每次绘制场景时被调用,并且还负责调用任何事件监听器。以下是两个线程的各种详细信息:
主线程
- 初始化导演(
MainActivity.java
) - 初始化游戏场景(
GameLayer.java
)- 在 jbox2d 世界中初始化物理对象,在 cocos2d 层中初始化精灵
- 设置碰撞监听器以处理特殊碰撞
渲染器线程
- 默认调度器滴答处理函数(
GameLayer.java
中的update()
)- 步进世界
- 遍历所有物理对象并设置相应的精灵位置/角度
- 碰撞监听器(
Gamelayer.java
中的postSolve
),用于特殊效果,例如- 当岩石撞击重物时将其分解成碎片
- 当岩石撞击雪人时开始得分动画
- 触摸处理程序(
GameLayer.java
中的ccTouchesEnded
)以添加雪花/岩石 - 指标绘制函数(
CCDirector.java
中的showFPS
)
上图以图形方式展示了绘制循环的工作原理。它类似于 Cocos2D 部分中显示的主循环,但更复杂一些。在每次调度器滴答时,都会计算并更新新帧。在此滴答期间,会处理回调和游戏逻辑。例如,调用 JBox2D 来处理游戏物理。然后,就可以开始渲染了。
渲染完成后,可能会有短暂的帧时间等待。此等待是为了确保一致的帧速率。例如,如果应用程序能够计算 100 FPS,它实际上可以放慢速度只渲染 60 FPS。其余时间可以用于更多的游戏逻辑、获取数据等。
Icy Rocks Workload 性能概述
Icy Rocks Workload 是一个单线程 Android 工作负载,Android 系统称之为“GLThread”。在典型的基准测试运行中,大部分时间都花在 Android Runtime\* (ART) 编译代码和 OpenGL 原生图形例程中。一小部分时间通过 Java Native Interface (JNI) 和 System.arraycopy 花在原生代码上。
该工作负载展示了 Android Runtime 的功能、Android Stack 的图形功能以及底层 SoC 平台的硬件功能。
Java 版的 Icy Rocks Workload 在浮点运算和逻辑(ALU)运算、分支预测(浮点比较)硬件以及 DTLB 和 L2 缓存内存事务方面成本较高。
如前所述,该工作负载有五个相同的运行:在每次运行中,我们在一种特定的岩石+雪花配置下花费 20 秒。其中大多数配置具有相同的性能特征(例如,每周期指令数、热门 Java 执行代码等)。该工作负载密集使用 32 位单精度浮点数,这是物理碰撞计算的精度。
使用 Icy Rocks Workload 发现的机遇(开源)
在我们的性能调查中,我们发现 JBox2D 物理引擎使用了 `java.lang.Math` 标准库方法的自定义实现。在当前实现中,为 `Math.sin()` 和 `Math.cos()` 结果查找维护了巨大的数据结构。我们建议更改 JBox2D 代码以使用标准的 java.lang.Math 库方法以获得最佳性能。
我们的调查还表明,JBox2D 使用对象池来避免对象分配和垃圾回收的运行时成本。这可能会损害 GC 的整体性能,可能导致堆碎片,并降低对象的引用局部性。我们的建议是使用垃圾收集器而不是对象池。我们进一步预测,由于在不久的将来使用基于线程局部分配缓冲区(TLAB)的对象分配,GC 和引用局部性将得到改善。
此外,Intel 已向 Android 开源项目 (AOSP) 贡献了多项优化,并且由于 Intel 对 Icy Rocks Workload 的性能分析,Intel 的 ART 二进制文件中添加了大量 ART 优化。这些将在后续文章中介绍。
Icy Rocks Workload for Android 的开源
Icy Rocks Workload 的开源是 Intel 改变 Android 性能衡量方式战略的一部分。当前的一系列合成基准测试在很大程度上是不现实的(它们不能反映真实的应用性能),有时甚至可以被优化掉,正如我们最近对 CFBench\* 和 Quadrant\* 所做的那样。我们的战略是说服 Android 社区放弃那些可以被优化掉的合成基准测试,并用更真实的工作负载(如 Icy Rocks Workload)来替代它们。
下载地址
源代码
https://git-amr-1.devtools.intel.com/gerrit/gitweb?p=android_workloads-icyrocks-java.git
参考文献
cocos2d-android-1: https://code.google.com/p/cocos2d-android-1/
什么是 Cocos2d-x?: http://cocos2d-x.org/
Box2D: http://Box2d.org
JBox2D: A Java Physics Engine: http://Jbox2d.org
如何使用 Cocos2D 制作简单的 Android 游戏: http://dan.clarke.name/2011/04/how-to-make-a-simple-android-game-with-cocos2d/
使用 Cocos2D 2.X 教程入门 Box2D:弹力球: http://www.raywenderlich.com/28602/intro-to-box2d-with-cocos2d-2-x-tutorial-bouncing-balls
如何使用 Cocos2D 和 Box2D 制作投石器射击游戏(第一部分): http://www.raywenderlich.com/4756/how-to-make-a-catapult-shooting-game-with-cocos2d-and-box2d-part-1
如何使用 Cocos2D 和 Box2D 制作投石器射击游戏(第二部分): http://www.raywenderlich.com/4787/how-to-make-a-catapult-shooting-game-with-cocos2d-and-box2d-part-2
关于作者
Rahul Kandu 是 Intel 软件和解决方案集团 (SSG)、系统技术与优化 (STO) 部门、客户端软件优化 (CSO) 部门的软件工程师。他专注于 Android 性能,并寻找优化机会,以帮助 Intel 在 Android 生态系统中获得更好的性能。
Baotong Du 是 Intel 软件和解决方案集团 (SSG)、系统技术与优化 (STO) 部门、客户端软件优化 (CSO) 部门的软件工程师。他专注于 Android Java 工作负载开发。
Jean Christophe Beyler 是 Intel 软件和解决方案集团 (SSG)、系统技术与优化 (STO) 部门、客户端软件优化 (CSO) 部门的软件工程师。他专注于 Android 编译器和生态系统,同时也深入研究其他与性能相关的技术和编译器技术。
Paul Hohensee 是 Intel 软件和解决方案集团 (SSG)、系统技术与优化 (STO) 部门、客户端软件优化 (CSO) 部门的 Android VM 运行时架构师。他专注于提升 Android Java 的速度和服务性。