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

如何在Intel®架构上优化您的Android应用(NDK)(两分钟内完成)

2014 年 8 月 14 日

CPOL

5分钟阅读

viewsIcon

13282

在一次 Intel CodeFest 活动中,我针对 Intel 架构优化了我所有的游戏,过程非常简单。我将描述我的经验,希望能引起您也这样做。

引言

我是 Jean-Claude Cottier,一位资深的视频游戏行业从业者。我在这个领域已经工作了 18 年,并于 2008 年创办了我自己的独立游戏工作室:Ovogame。我的游戏可以在包括 Android 在内的多个平台上找到:http://bit.ly/1i8aA1D。最近,在一次 Intel CodeFest 活动中,我针对 Intel 架构优化了我所有的游戏,过程非常简单。我将描述我的经验,希望能引起您也这样做。

为了开发我的游戏,我使用的是我自己的技术:一个 C++ 多平台引擎(Android、iOS、BB10、Win32 和 OSX)。我几乎完全在 Win32 下使用 Visual Studio Express 进行开发(为了速度和易用性)。为了将我的游戏移植到其他平台,我只需要复制资源(源代码和数据),然后使用专用的工具链(Android 的 ADT-NDK、iOS 和 OSX 的 XCode...)重新编译。通常,这只需要几分钟,因为所有内容在不同平台之间都是 100% 兼容的。为了实现这个小小的奇迹,我的引擎只使用了标准的 C++ 代码和跨平台 API(OpenGL、OpenAL、OpenSL...)。对于文件格式管理(jpeg、ogg、zip...),我使用的是一个提供源代码的不同 C/C++ 库,因此我可以在任何平台上重新编译。显然,我仍然为每个平台使用一些特定代码(Java、Objective C、DirectX...),但我将这些代码保持在最低限度,并且它们从未与游戏代码混合。

当您为 Android 进行原生开发时,NDK 会将您的 C++ 代码编译成一个库,该库可以通过 JNI 接口集成到 Java 项目中。在我的引擎中,Java 代码被保持在最低限度(主要是与系统的通信),并且从一个游戏到另一个游戏都不会改变。现在可以只使用 C++(不使用 Java)来创建 Android 应用程序,但我并不推荐这样做,因为有时您会想使用第三方 Java API(例如显示横幅广告)。

如今,您可以在 Android 设备上找到不同的 CPU(ARM、Intel x86...)。这对于用 Java 开发的应用程序来说无关紧要,因为 Java 是一种解释型语言。但当您像我一样用 C++ 进行开发时,您必须为特定的架构编译您的代码。大多数 Android 设备由 ARM 芯片驱动。像许多 C++ 开发者一样,我之前只针对 ARM 架构(armv5 和 armv7)。感谢 NDK,您可以为不同的架构编译您的代码 - armv5 用于旧的 Android 设备,armv7 用于较新的设备。这由系统自动管理 - 您的 APK 同时包含这两个版本,当用户启动您的应用程序时,会使用最适合的代码。x86 架构驱动的设备显然无法运行 ARM 代码(因为它们是不同的架构)。因此,这些设备必须通过虚拟机来解释 ARM 代码。即使 x86 设备在解释 ARM 代码方面做得非常出色,但未能充分利用它们的全部能力也是一种浪费。如果您为 x86 编译您的代码,您的应用程序将在 Intel 设备上运行得更快,并且消耗更少的电池。总的来说,用户体验会更好。支持非常简单,只需包含一个新的编译目标即可。您需要用编辑器打开 jni/Application.mk 并更新 APP_ABI 变量(它定义了不同的目标)。由于我之前只针对 armv5 和 armv7,我的变量设置如下:

APP_ABI := armeabi armeabi-v7a

要添加对 Intel 架构的支持,您只需将 x86 添加到列表中。

APP_ABI := armeabi armeabi-v7a x86

现在,每次编译您的应用程序时,您都会得到一个与 x86 架构兼容的额外目标,它将被添加到您的 APK 中。当应用程序安装在 Intel 设备上时,将执行这个新兼容的代码。我的所有游戏现在都针对 x86 设备进行了全面优化。如果您像我一样使用 NDK 用 C++ 开发您的应用程序,您也应该针对 x86 架构。它如此简单,不利用它就太可惜了。

就个人而言,我没有遇到任何技术问题来支持这个新目标,因为我的引擎使用的是标准 C++。事实上,我当天就重新编译并更新了我所有的游戏。

您需要知道 APK 会稍微大一点(用于存储 x86 代码),如果您接近 Google Play 的 50MB 限制,这可能会令人烦恼。

如果您使用的是仅为 ARM 编译的第三方 API,您将无法再使用它们。我尽量只使用提供源代码的外部库,因为它们更具跨平台兼容性。

如果您需要根据当前编译的架构在 makefile 中更改某些内容,您可以编辑您的 Android.mk 并添加条件:

ifeq ($(TARGET_ARCH_ABI), x86)

‘此代码仅在编译 x86 目标时可见。’

endif

如果您想阅读一篇关于将您的 Android 应用程序移植到 x86 的更深入的文章,您可以访问 Intel® Developer Zone for Android 网站:http://intel.ly/1jnDfAd

我认为,对于像我一样使用 NDK 的绝大多数开发者(无论是使用自己的引擎还是 Cocos2D 等),在 APP_ABI 变量中添加 x86 字样就足以支持 Intel 设备。您会同意,这在两分钟内完全可以做到。您应该这样做。

相关文章与资源

作者简介

Jean-Claude Cottier 是一位资深开发者,过去 18 年一直在游戏行业工作。他曾在 Lionhead Studios 担任引擎架构师,并幸运地为一些真正出色的游戏(《神鬼寓言》和《电影制作人》)开发了 3D 技术。尽管他对技术充满热情,Jean-Claude 还是希望更多地参与游戏设计。他离开了 AAA 行业,创办了自己的独立公司 Ovogame。他创建了一个原生的跨平台引擎,使他能够在几分钟内将他的众多游戏移植到大多数相关平台。

© . All rights reserved.