基于Intel®架构的平台上的NDK驱动Android游戏应用程序的开发和优化





5.00/5 (1投票)
基于Intel®架构的平台上的NDK驱动Android游戏应用程序的开发和优化
Android 原生开发工具包 (NDK) 是 Android SDK 的配套工具,它允许您使用 C 和 C++ 等原生代码语言实现应用程序的部分功能。
您可以下载 NDK 工具包: https://developer.android.com.cn/tools/sdk/ndk/index.html
面向 X86 指令集架构的 NDK
Android 是由 Google 开发的开源操作系统。目前,Android 可以在三种指令集架构系列上运行:ARM、x86 和 MIPS。X86 指的是基于 1978 年推出的 Intel 8086 CPU 的一系列指令集架构。让我们从应用程序的角度来描述 X86(也称为 Intel® 架构或 IA)与其他 Android 运行的芯片组之间的区别。
Android 应用程序可分为两类
- Dalvik 应用程序,包括 Java* 代码,仅使用官方 Android SDK API 和必要的资源文件(例如 .xml 和 .png),并编译成 APK 文件。
- Android NDK 应用程序,包括 Java 代码、资源文件以及 C/C++ 源代码,有时还包括汇编代码。所有原生代码都编译成动态链接库(.so 文件),然后通过 JNI 机制由主程序中的 Java 调用。
Android 游戏引擎
游戏引擎是游戏应用程序的关键模块。Android 上运行着几种引擎,包括开源的 2D 和 3D 引擎以及商业引擎。因此,将基于 Android 的游戏迁移到 IA 平台进行开发很困难。Cocos2d-x 和 Unity 3D 是 Android 平台上最流行的游戏引擎。
Cocos2d-x 基于 Cocos2d-iPhone,并扩展了支持的平台,使用多种编程语言共享相同的 API 结构。自 2010 年 7 月推出以来,cocos2d-x 的下载量已超过 5 亿次。Zynga、Glu、GREE、DeNA、Konami、TinyCo、Gamevil、HandyGames、Renren Games、4399、HappyElements、SDO 和 Kingsoft 等移动游戏行业的巨头都在使用 cocos2d-x。
Unity 3D 是 Unity Technologies 开发的跨平台游戏引擎,内置 IDE。它用于为 Web 插件、桌面平台、游戏机和移动设备开发视频游戏,并被超过一百万名开发者使用。它从 2005 年的 OS X 支持游戏开发工具发展成为一个多平台游戏引擎。最新更新 Unity 4.1 于 2013 年 3 月发布。目前支持 iOS、Android、Windows、Blackberry 10、OS X、Linux、Web 浏览器、Flash*、PlayStation 3、Xbox 360、Windows Phone 和 Wii 的开发。
在 IA 平台上开发基于 Android NDK 的游戏
在谈论游戏开发之前,我们应该先谈谈 Android 平台。众所周知,游戏风格多种多样。不同风格的游戏需要不同的设计原则。在项目开始时,您通常会决定游戏的类型。除非您想出一些完全新颖且前所未见的东西,否则您的游戏创意很可能符合当前流行的广泛类型之一。大多数类型都有成熟的游戏机制标准(例如,控制方案、特定目标等)。偏离这些标准可以让游戏大获成功,因为玩家总是渴望新事物。一些常见的类型包括
- 街机与动作
- 益智与解谜
- 卡牌与赌场
- 休闲
- 动态壁纸
- 竞速
- 体育游戏
- 组件 (Widgets)
- etc
开发通用 Android 游戏的流程与其他 Android 应用程序类似。首先,从 Google 网站下载 Android SDK 和 NDK 并正确安装。
假设您已完成所有安装和准备工作。以 Cocos2d-x 游戏引擎为例,让我们看看如何为 Intel 架构创建游戏。
下载 Cocos2D-x
从网站下载最新稳定版的 Cocos2D-x: http://www.cocos2d-x.org/projects/cocos2d-x/wiki/Download
执行批处理文件
从 Windows Explorer 执行批处理文件。当询问项目位置时,将其设置为类似 com.yourproject.something 的值,然后选择项目名称和目标 ID。这将在 cocos2dx 安装文件夹中创建一个以项目名称命名的文件夹。您应该会看到脚本执行,没有错误,如下所示
设置 NDK_ROOT 环境变量
在 home\<yourname>\.bash_profile 文件的末尾添加以下环境变量(在此 情况:c:\cygwin\home\user\.bash_profile)
NDK_ROOT=/cygdrive/<yourname>/
export NDK_ROOT
重启 Cygwin,输入 cd $NDK_ROOT,您应该会看到此屏幕
执行 build_native.sh 文件
默认配置是 ARM;我们需要将其更改为编译 x86。打开文件 \helloworld\proj.android \build_native.sh,找到 ndk-build 命令,并在命令末尾添加 APP_ABI=x86 参数。在 Cygwin 中运行它,您将看到
将项目导入 Eclipse
现在转到 Eclipse,选择新建项目 -> 从现有项目导入。
构建和运行
在此步骤中,Eclipse 将会遇到一些问题
导入 org.cocos2dx.lib 无法解析 HelloWorld.java
/HelloWorld/src/com/young40/test line 26 Java Problem Cocos2dxActivity 无法解析为类型 HelloWorld.java
/HelloWorld/src/com/young40/test line 30 Java Problem Cocos2dxActivity 无法解析为类型 HelloWorld.java
/HelloWorld/src/com/young40/test line 33 Java Problem
您必须将以下库作为项目导入 Eclipse
cocos2d-2.1beta3-x-2.1.1/cocos2dx/platform/android/java
转到 Project -> Build,然后选择 Run As -> Android Application
然后将构建一个用于 cocos2dx 游戏引擎的游戏框架。您可以向此项目添加游戏逻辑、音频、图片等资源以制作完整的游戏。
优化 IA 平台上的基于 Android NDK 的游戏
Intel® System Studio 是一个用于在 Android 平台上分析和优化应用程序的工具套件。当然,我们可以用它来优化游戏。Intel System Studio 包括:
- Intel® C++ 编译器
- Intel® 图形性能分析器
- Intel® VTune™ Amplifier
- (Intel® JTAG 调试器)
此处我们不详细解释每个工具。取而代之的是,我们将通过一个示例来演示 Intel 工具的工作方式。
首先,我们以一款名为 Bounding Ball 的应用程序为例,该程序将在 Intel® Atom™ Z2460(代号 Medfield)处理器上运行。该游戏有 800 多个球以随机速度移动并相互碰撞,没有任何规律。通过测量 FPS,我们发现性能很差,未经优化时仅为 6 FPS。
我们可以使用 Intel® 图形性能分析器(Intel® GPA)来定位瓶颈模块,并判断是 CPU 瓶颈还是 GPU 瓶颈。
下面的 Intel GPA 屏幕截图显示了一个图表,通过 GPA 在 Android 平台上描述了此应用程序的详细信息。从中可以看出,CPU 消耗了 52.5% 的资源。这对于一个应用程序来说比例相当高。同时,GPU 内部运行的 ISP Load、TA Load、TSP Load 和 USSE Total Load 都低于 10%,这意味着 GPU 负载正常。因此,我们可以得出结论,瓶颈在 CPU 模块。为了进一步分析 CPU 瓶颈问题,我们需要使用 VTune™ 分析器对代码进行性能分析。
这里我们不描述如何使用 VTune 分析器,只解释我们运行它时获得的结果。热点是 libm.so 中的 sin 和 cos 函数。那么问题来了:为什么应用程序会花费如此多的时间和 CPU 周期来运行这两个函数?
通过检查应用程序源代码,我们发现当每个球通过 OpenGL ES* 渲染时,都会调用这两个热点函数。由于所有球的几何形状相同,只有大小不同。我们可以通过 OpenGL 函数 glScale
来复制球,从而大大减少热点函数的使用。
经过代码优化后,性能提高了 80%;FPS 为 14。此外,我们可以使用 Intel C/C++ 编译器来编译应用程序,以在 Intel 架构平台上获得更好的性能。Intel C/C++ 编译器提供了许多用于在 IA 平台上进行性能优化的标志。这里我们只介绍其中一些。
- SSSE3_ATOM
Supplemental Streaming SIMD Extensions 3(SSSE3 或 SSE3S)是 Intel 创建的 SIMD 指令集,是 SSE 技术的第四代。 - IPO
过程间优化标志将减少函数调用开销,消除死代码,并重新排序常量传播和过程。 - PGO
在剖析引导优化标志中,许多问题会留给优化器,例如 - x > y 的发生频率如何
- count 的大小是多少
- 哪些代码被访问以及访问频率如何
此外,Intel C/C++ 编译器还可以增强应用程序,如下所示
- 更准确的分支预测
- 基本块移动以改善指令缓存行为
- 更好地决定函数内联(帮助 IPO)
- 更好的函数排序优化
- switch 语句的优化
- 更好的向量化决策
使用不同的编译器和不同的编译参数,应用程序可以获得不同的性能。这里是 GCC 和 ICC 两种编译器的性能比较。同一款 Bounding Ball 应用程序在基于 Intel Medfield 的 Android 手机上运行。蓝色部分是 GCC 的性能,红色部分是 ICC 的性能。基线是不带任何参数的编译。图表的第二部分是使用 arch=atom 编译。第三部分是使用上述所有参数重新编译。最后,可以看到 ICC 编译的应用程序性能比 GCC 高 60%。
摘要
我们简要介绍了 IA 平台上的 Android 游戏开发和优化。游戏引擎是所有游戏开发的核心部分。如果它们在 IA 平台上运行良好,那么游戏也将运行良好。我们以流行的游戏引擎 cocos2dx 为例,演示了如何在 IA 平台上进行开发。Intel 还提供了许多工具供开发人员在 Android 平台上优化其游戏应用程序。使用 Intel System Studio,我们展示了如何优化演示应用程序的步骤。
关于作者
陶鹏是 Intel 软件与服务部门的应用工程师,专注于移动应用赋能,包括 x86 设备的 Android 应用开发和优化,Web HTML5 应用开发。
其他相关文章
- Intel® Atom™ 平台上的 Android* 应用程序开发和优化
- 在基于Intel® Atom™处理器的Android*手机和平板电脑上开发传感器应用程序
- 开发具有语音识别功能的Android*应用程序
- 基于Intel®架构的平台上的NDK驱动Android游戏应用程序的开发和优化
- 用于开发移动应用的 Intel® HTML5 工具
要详细了解 Intel 的 Android 开发工具,请访问 Intel® Android 开发者专区。