在过去的18年里,一直在游戏行业工作,并且在2008年成立了自己的独立游戏工作室:Ovogame。游戏可以在包括Android在内的多个平台上找到。最近,在一次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++创建一个Android应用程序(没有Java),但不推荐这样做,因为有时会想要使用第三方Java API(例如显示横幅广告)。
如今,可以找到不同的CPU为Android设备提供动力(ARM, Intel x86...)。这对使用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开发应用程序,也应该针对x86架构。这非常简单,不利用它将是一种遗憾。
就个人而言,没有遇到任何技术问题来支持这个新目标,因为引擎使用了标准C++。事实上,在同一天重新编译并更新了所有的游戏。
需要知道APK会稍微大一点(以存储x86代码),如果接近Google Play上的50MB限制,这可能会很烦人。
如果使用的是仅针对ARM编译的第三方API,将无法再使用它们。尽量只使用提供源代码的外部库,因为它更跨平台友好。
如果需要根据当前正在编译的架构更改makefile中的某些内容,可以编辑Android.mk并添加条件:
ifeq ($(TARGET_ARCH_ABI), x86)
'这段代码只有在编译x86目标时才会显示。'
endif