<audio id="audio" title="第31讲 | 热点剖析（四）：安卓端和苹果端游戏开发有什么区别？" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/fd/ae/fdfd2df5d858c717108b07b300d4f0ae.mp3"></audio>

所谓的移动端，指的是可以随时拿在手上游戏和工作的，自带直流电源的设备，所以从游戏角度讲，手机、掌上游戏机、iPad都属于移动端设备。

我们今天的侧重点在安卓和苹果端的手机游戏，在开始说手机游戏之前，我们先简单了解一下掌上游戏机，因为这毕竟是移动端游戏的鼻祖。

在游戏发展的历史中，游戏机从8位发展到32位、64位；游戏存储的媒体，从芯片到卡带到光盘再到网络下载。从电视游戏机到掌上游戏机，游戏存储的容量也越做越大，游戏机也变得越来越小巧、轻薄。

在如今的手机游戏流行之前，各种掌上游戏机在游戏界的竞争可谓硝烟弥漫。GB、GBA、GBASP、NDS、3DS、PSP、PSV，这是很多人都耳熟能详的掌上游戏主机。当然在这之中也有一些只是昙花一现。加上智能手机的出现，能在手机上玩到如此多种多样的游戏，在此之前，这些东西人们从来没有想过。

因为在当时的条件下，GameBoy系列、NDS系列、3DS系列，每一款都是惊艳世界的产品。然而到了智能机时代，这些产品的优势逐渐被削弱，一大部分掌机玩家被分流去了手机和平板的市场。

而自从2007年第一代iPhone发布到今天，智能机经历了多次的变革。随着硬件的提升，移动端的游戏画面逐渐超越了2000年左右次世代32位机，比如PS2以及同时期的次世代游戏机。所以今天我们可以在智能机上玩到相当多的2D、3D游戏，**尽管移动端都是小屏幕，但呈现结果其实已经不输给几年前的高端电脑。**

智能机发展到现在，操作系统从苹果、安卓、塞班、黑莓、Windows等，大战最终剩下两大操作系统阵营，苹果和安卓。而苹果和安卓两大生态系统，一个是**封闭式**的系统，一个是**开放式**的系统，有相同点，也有不同点，所以在这两大系统下编写游戏，有很多内容可以讲。

首先，从**编程语言**这方面说，苹果系统大量使用Objective-C、Swift来开发游戏，而安卓大量使用的是Java。

而苹果公司选择Objective-C的原因是因为苹果收购了NEXTSTEP。NEXTSTEP是由NeXT.公司所开发的操作系统。这套系统以Mach和BSD为基础，Objective-C作为原生语言，拥有先进的GUI界面。后来苹果公司将NeXT买下，成为Mac OS X的基础，抛开语言特性不说，Objective-C比C++出现年代更早，更为动态），使用Objective-C也有很大因素是这一历史原因。

而安卓刚诞生的时候，要与苹果展开竞争，目的肯定是要降低开发门槛，吸引更多开发者加入，才能带动安卓的普及。所以选择Java入门比C++来得快，在跨平台的能力上也比C++来得容易，庞大活跃的Java社区可以提供足够的第三方资源库。所以Java成为了安卓平台的首选开发语言，选择Java是一个在执行效率和开发效率之间均衡的选择。

在安卓和苹果端开发游戏，除了语言区别之外，还有审核区别。如果我们说的是中国开发者，那苹果开发者的开发工作就复杂多了，不仅要申请开发者帐号，递交开发者年费，还要申请游戏运营资质等等。在安卓端，你就省却了申请开发帐号，开发年费的问题，但是其他资质一样是需要申请的。

不管两者平台的开发语言如何，在安卓和苹果端，使用游戏引擎编写游戏的话，除了使用的语言不同之外，编程接口、引擎的周边工具、美术资源以及最终构建完成后的游戏效果都是一样的。

在iOS的环境下，我们同样也可以使用游戏引擎来编写游戏。在苹果的体系下，2D游戏比较流行的引擎是SpriteKit。

SpriteKit是苹果公司在iOS 7的SDK中新加入的一个2D游戏框架，包括物理引擎、视频、滤镜、遮罩等等。IDE中对SpriteKit也有比较好的集成，因为减少了开发者的工作。

SpriteKit里面有几个比较常用的类：

<li>
SKSpriteNode，用来绘制精灵的纹理；
</li>
<li>
SKLabelNode ，文本渲染类；
</li>
<li>
SKVideoNode，视频播放的类；
</li>
<li>
SKEmitterNode，粒子系统的创建和渲染；
</li>
<li>
SKShapeNode，基于Core Graphics 路径形状的渲染；
</li>
<li>
SKEffectNode，使用遮罩来裁剪子节点的类。
</li>

因为是苹果公司推出的2D游戏引擎，所以你可以在苹果的机器上编写和调试代码，并且在iPhone上进行预览和测试。

在编写游戏的过程中，安卓使用工具是Android Studio，而苹果使用的是XCode等编程工具。除了苹果特有的游戏库之外，有不少通用的游戏引擎也可供选择，比如Cocos2d-x之类的，在这两个平台都能编写，比如Unity，比如libGDX游戏库，也是目前在安卓、苹果上编写游戏适合选择的一个游戏库。

所以如果使用跨平台的游戏引擎，**在两大平台下开发，除了开发语言的区别之外，底层的内容并没有什么区别**，比如Cocos2d-x、libGDX等等，都是跨平台生成不同目标代码的引擎。

我们继续拿libGDX来做说明。libGDX兼容多种平台系统，自然也包括安卓和苹果。

这款引擎兼容性强，为调试和开发提供了便利。为什么这么说呢？你可以在电脑上编写测试和调试游戏，但是不需要打开安卓模拟器。开发应用的同学应该知道，安卓应用一般是在电脑上编写、测试、调试，并且到模拟器或者安卓硬件上进行预览运行，但是libGDX解决了这个问题，你可以直接在桌面上进行开发测试和调试。

libGDX引擎是由audio（音频操作）、files（文件读取）、graphics（2D/3D图像）、math（数学绘图运算）、physics（Box2D物理引擎封装）、scenes（2D/3D场景组件）、utils（内置工具）这些主要模块所组成。

libGDX主要是用Java编写的，还用了少部分的C/C++代码。至于这部分C/C++代码，是为了针对一些性能做出优化而编写的，比如音频、物理引擎等等。在Java层面，它已经封装了所有的本地代码，相比别的安卓游戏引擎，libGDX的执行效率也比较突出。

libGDX使用jni封装了Box2D物理引擎的C++版本，所以比之JBox2D速度更快，目前比较流行的几个包含物理引擎安卓游戏引擎（如Andengine、Rokon等）都在用libGDX的封装版本。

libGDX的开发工具也是非常地丰富，比如粒子编辑器、文字生成工具、贴图合并工具，一些UI库等。

另外，在网络部分，libGDX最早的版本提供了单机游戏的编写或者一些联网程度不是特别高的游戏。

在后续的版本里面，由于市场和竞争的原因，现在新版本的libGDX也提供了专门的网络模块。在一款将虚拟环境与现实地理位置信息结合在一起的手机游戏《Ingress》推出之后，也有部分国内公司基于libGDX网络模块编写的手机网络游戏。

另外，libGDX拥有很强大的第三发工具，比如第三方物理引擎的属性编辑器PhysicsEditor、贴图资源打包工具TexturePacker以及Spine。Spine是制作2D骨骼游戏的动画制作软件，功能非常强大，它的作者也是libGDX的核心代码编写者之一。

从文档看，libGDX的文档数量已经比较完善了，但是大部分都是英文，对于部分开发者来说学习难度较大。虽然libGDX拥有非常活跃的官方讨论社区，但是大部分还是英文的。

你可以通过libGDX来编写苹果和安卓的游戏，当然如果你编写的是网络游戏，那么服务器端就需要你自己来编写。

## 小结

我来总结一下今天的内容。

<li>
从游戏角度讲，手机、掌上游戏机、iPad都属于移动端设备。而进入智能机时代之后，掌上游戏机逐渐退居幕后，成为少部分游戏发烧友的选择。
</li>
<li>
安卓端和苹果端在开发游戏中的区别，主要体现在开发语言上。苹果系统大量使用Objective-C、Swift，而安卓大量使用的是Java。
</li>
<li>
之后，我介绍了苹果端的比较流行的引擎SpriteKit以及适用于各种平台的libGDX。使用libGDX在各个平台编写出的游戏，表现几乎是一样的，除了执行效率或者耗电水平会有细微的差别，但这和引擎其实关系不大。
</li>

最后，给你留一个小问题。你知道什么是2D骨骼游戏吗？能否举个例子？

欢迎留言说出你的看法。我在下一节的挑战中等你！
