WWDC15 iOS游戏开发3个新框架全解
简介
在此次WWDC的游戏相关视频中,苹果再一次展现了它非凡的技术整合和持续创新能力。除了继续完善已有的2D游戏框架SpritKit, 3D游戏框架SceneKit和全新的图形渲染API Metal 外,今年还新增加了GamePlayKit, ReplayKit和Model I/O三个新框架。
- GamePlayKit给游戏开发者带来了全新的游戏架构(“实体组件系统”)和一些通用模式(比如:状态机, Goal-agent-behavior 系统等),同时它还提供了大量游戏算法,比如寻路算法,模糊逻辑和规则系统等。
- ReplayKit可以让玩家在游戏中录制游戏视频,并且可以添加语音评论,然后通过社交网络分享出去。
- 而Model I/O框架,主要是用来处理3D资源和数据,同时可以给一些资源做离线处理,提高游戏运行时性能。
SpriteKit新功能
SpriteKit是苹果在2013年推出来的2D游戏开发框架,它最初的设计很多来自Cocos2D-iPhone项目,特别是API方面,几乎和Cocos2D-iPhone没有差别。得益于此,Cocos2D用户可以用很小的成本转到SpriteKit上面来。
在去年的WWDC中,苹果推出了一系列重磅级功能特性:物理集成,XCode资源打包、实时编辑器,SceneKit 3D框架,Metal图形API等,这让SpriteKit成为了开发iOS/OS X平台上的游戏的首选游戏框架。
今年,苹果继续发力,添加了3个新的节点类型,同时还完善了整个游戏开发流程和工具链支持。
此类模拟游戏里面的照相机,它可以定义游戏的可见视图,同时它也是一个node,可以对它进行缩放,旋转和平移等操作。此类是开发者继去年 WWDC后最希望实现的功能,对于实现一些大地图的冒险类游戏和RPG游戏非常有帮助,可以给主角添加一个SKCameraNode子节点,然后游戏视角 就会跟随主角的移动而移动了。另外,游戏里面可以支持多个SKCameraNode.
此类可以实现基于位置的音效,环境音效和沉浸性音效。可以想像一下,一颗导弹向你的主角飞过来,声音由远及近,当导弹离你的主角很近时,甚至可以听到导弹尾部喷气的声音,这种游戏音效会给玩家带来非凡的听觉感受。
此类是SpriteKit的一个亮点,它可以实现已有组件的序列化,支持数据驱动式的游戏开发。
配合XCode,序列化的组件可以被当作游戏资源在各个不同的工程和游戏里面重用。
而且它会自动Cache,同样的文件不会被加载多次。对于一些复杂的场景和组合动作序列,当需要重用它们的时候,SKReferenceNode是个大杀器。
Metal支持
目前iOS 9全面支持Metal,已有的SpriteKit游戏跑在iOS 9上面,不需要做任何修改即可享受Metal带来的性能提升。如果你的设备支持Metal,那么它就会使用Metal,反之则切换到OpenGL ES.
SpriteKit 相关工具
一个好的游戏框架离不开一个好用的工具支持,游戏开发者可以通过工具快速地进行迭代式开发。苹果一直致力于完善SpriteKit的工作流,让开发者可以更快速地开发游戏,同时让玩家可以不用关心技术细节,只需要专心游戏玩法即可。
今年WWDC XCode工具支持方面主要有以下几点:
- 资源分类( Asset catalog )支持,开发者可以更精确地控制不同设备使用的资源分辨率,最重要的是,玩家在下载游戏到设备里面时,只会下载与其设备分辨率匹配的资源。
- 按需加载资源,通过给不同的资源设备Tag,可以指定某些场景和关卡只加载特定Tag的资源。
- XCode快速预览:支持在Playgound里面使用Swift编写一些测试代码,然后快速预览效果。不需要额外的编译,立马就可以看到API的使用效果,这对于测试一些API和验证一些想法非常有帮助。
- 2D时间轴动作编辑器:这个应该算是SpriteKit的大杀器了,它是一个功能完善的2D动作编辑器,可以支持实时预览动作效果,并且同时支持2D和3D。
- 数据驱动:SKReferenceNode可以让可重用的游戏组件数据化,让玩家可以用更少的代码来完成游戏开发。
小结
整个SpriteKit在性能,工具和易用性方面都有了较大的提升,另外,配合SceneKit,开发者可以更容易地开发3D休闲类游戏了。
SceneKit新功能
SceneKit是苹果为了让游戏开发者更方便地开发3D游戏而推出来的,它支持iOS和MacOS X。
同时,它还完美支持粒子系统,物理集成和SpriteKit。今年,苹果改进了场景编辑器,同时对Metal的支持也更加完善了。
新的场景编辑器
新的场景编辑器的功能总结如下:
- 支持更多的3D文件格式: DAE,OBJ,Alembic, STL和PLY文件格式。
- 新的原生文件格式,使用NSKeyedArchiver来存取
- Shader修改器和环境光遮蔽(Ambient Occlusoni)
- 天空盒(Skybox)和几何修改器
- SCNTechnique 支持
- 支持声音节点
- 支持Model I/O(后面会具体介绍Model I/O是什么)
除了这7点以外,还有诸如compute shader, relfective cub map等功能。
Metal支持和 SKTransitions
新的SceneKit可以根据设备类型自动匹配是否使用OpenGL或Metal作为渲染后端,同时它支持SpriteKit的切换场景切换,制作SceneKit场景切换效果更容易了。
Metal 新功能及性能优化
今年WWDC游戏相关视频中,苹果用了3个视频介绍了Metal的新特性以及性能优化方法,同时SpriteKit和SceneKit在iOS 9中都是默认使用Metal作为渲染API。Metal作为苹果生态圈的高性能图形渲染API,大有可能在将来某一天取代OpenGL的趋势。
新功能介绍
这里简单给大家介绍一下Metal的新功能,具体的细节还需要查看相关文档和视频。
- 新的内存模型:它一共支持3种内存模型,分别是共享内存模型,私有内存模型和托管内存模型。
- 新的纹理压缩格式(ASTC):
- 设备GPU 类型判断:自动根据设备的GPU类型来判断支持的特性集合。
- MetalKit框架:让Metal应用开发更加简单方便。
- Metal performance shader框架:提供了一系列数据并行算法。
- Metal调试工具:更方面地调试Metal图形应用。
- Metal应用程序瘦身:这一点和上面介绍的SpriteKit瘦身原理是一样的。
MetalKit框架
MetalKit对于一些常见的应用场景提供了高效的实现,开发者可以用更少地代码来开发应用,并且开发出来的应用性能和稳定性会更高。
MetalKit提供了一个 MTKView 类,它统一处理了渲染一个Metal场景所需要的设置代码,另外,它提供了一个纹理加载器,它可以从一个图片文件中创建一个Metal纹理。最后,MetalKit完美支持Model I/O,让3D模型的处理更加简单。
Metal performance shader框架
Metal performance shader是一个为GPU提供数据并行算法的一个框架,目前只支持A8处理器。
它定义了一些类似操作CPU风格的API,这样可以让GPU编程变得更加简单。它提供了很多内置的并行算法,比如兰索斯重新取样(Lanczos resampling),卷积函数(比如高斯滤镜等),直方图等。
Metal调试工具和最佳实践
众所周知,图形应用是非常难以调试的,而Metal在设计之初就考虑了多线程,而多线程的调试也是很困难的。因此,如果没有好用的工具支持,调试Metal应用将会变得非常困难。
此次,苹果围绕Metal提供了一系列好用的工具。比如:一个可视化的帧调试器,一个资源和状态查看器,shader性能分析工具,集成的离线Metal编译器等。
读者可以根据WWDC中关于Metal性能优化的视频去了解更多详细的信息。
另外,苹果给我们定义了一些最佳实践:
- 要尽早分析和经常分析代码
- 在最合适的时机去获得Drawable对象。
- 尽可能基于GPU去考虑多线程渲染。
- 提前创建好一些耗时的对象并尽可能地重用这些对象,提前编译好着色器程序。
小结
Metal已经成了苹果在3D图形渲染的一张王牌,它的性能远超OpenGL,开发者应该全面拥抱它,利用它来开发出性能更好的图形应用和游戏。同时,使用Metal,也可以用更少的代码来编写图形应用,另外,它也会让你的程序会更容易维护。
GamePlayKit介绍
GamePlayKit是今年WWDC游戏开发方面最大的亮点,它提供的实体组件系统将直接改变之前以继承为主的开发游戏方式。另外,还为游戏开发提供了大量实用的算法与设计模式,iOS游戏开发从未如此简单。
实体组件系统
实体组件系统是一种非常流行和先进的组织游戏逻辑的方式,采用它编写的游戏代码,更容易维护,更容易扩展,同时也更加灵活。
- GKEntity 在实体组件系统里面,所有的游戏对象都被组织成游戏实体(GKEntity),它只是一个组件(GKComponent)容器,可以在游戏过程中动态地添加和删除游戏组件。并且可以通过组件类型来访问组件并更新所有组件。
- GKComponent GKComponent是所有游戏组件的基类,它负责存储游戏数据,同时会随着实体的Update方法来更新自身的状态。所有的游戏逻辑被放置在
updateWithDeltaTime
方法中。 - GKComponentSystem 组件系统是处理组件的容器,它包含了所有同种类型的组件,并通过统一的逻辑来处理这些组件。组件系统并不关心实体,它会透明地对象所有同种类型的组件并更新其状态。
寻路算法
寻路算法可以让你指定一些节点生成一个双向连接图,然后可以通过简单的API调用找到任意两个点之间的最优路径。所有的有向图的基类是GKGraph,它是一个抽象类。它提供一些共用的逻辑,比如动态地添加和删除节点,连接这些节点并找到任意两个节点之间的路径。
此外,GamePlayKit还提供了两种特殊类型的图节点: GKGridGraph 和 GKObstacleGraph 。GKGridGraph非常适合2D游戏里面的路径查找。而GKObstacleGraph则可以设置一些障碍物,节点在寻路的时候,这些障碍物是无法穿越的。SKNode的边界,物理刚体和纹理都可以当作障碍物。
状态机
状态机是游戏玩法的骨架,游戏本身就是由一系列的状态机组成的。比如主角动画,AI状态,UI切换,关卡切换等,这些都可以使用状态机巧妙地解决。
GamePlayKit通过封装了 GKStateMachine 和 GKState 类,把一些共用的逻辑全部抽象出来了,开发者再也不用为每一个游戏去开发单独的状态机了。
Agent指的是会自已移动的游戏实体,它们通过Goal和Behavior来驱动自身的逻辑。Behavior是由一系列的Goal组成的,每一个Goal都包含有相应的权重。Agent在与玩家进行游戏交互的时候,可以表现得更像人类,因为它们也会做决策。
以往只有在一些很复杂的游戏里面才会看到的AI,如今通过GamePlayKit,我们可以非常轻松地给自己的游戏也添加了。通过给游戏里面的怪物添加一些AI,能够极大地增强游戏的趣味和粘性。
AI 策略(MinMax AI)
MinMax AI主要用于一些回合类游戏,比如象棋,围棋,Tic-Tac-Toe等。它还能给人类玩家提供一些建议,比如告诉你下一步棋该怎么下。另外,通过计算时间的设置,AI可以定义不同的难度等级。
规则系统
规则系统可以让你制作更加复杂的游戏AI,游戏世界的交互不再是“黑即是黑,白即是白”,而是以事先定义好的一定的规则去交互。游戏AI可以实现所谓的模糊逻辑,游戏怪物的活动可以根据定义好的规则系统去动态地调整和评估自己的行为。
随机数发生器(Random Sources)
每个游戏都有一些特别的随机数生成需求,而rand()函数只能生成一些伪随机数,并且可能跟平台实现还有一些出入。作为开发者,我们需要一个与具体平台无关的随机数生成器,另外这个随机数生成器还能产生符合一定数学分布的随机数。
Demobots示例
这是一个非常有价值的游戏demo,里面几乎涉及了GamePlayKit里面的大部分技术,是一个值得深入学习的游戏示例。这里是 下载链接
小结
实体组件系统不是苹果的原创,但是这一次GamePlayKit巧妙地整合了已有的游戏开发框架,iOS游戏开发变得从未如此简单和有效。配合强大的Swift和Xcode支持,更加如虎添翼。
ReplayKit和 Game Center
ReplayKit可以让玩家在游戏中录制游戏视频,并且可以给这些视频添加语音评论并且通过社交网络分享出去。另外Game Center允许访客模式,并且整合了产品服务器和沙盒服务器,这样测试和开发基于Game Center的游戏就变得更加简单了。
ReplayKit只有在iOS 9才能使用,另外开发者可以定制是自动在某些游戏场景开启视频录制还是让玩家自己选择录制时机。录制完的视频还可以被编辑和预览,从此玩游戏不再孤单。
另外,访客模式是不需要取得认证即可参与游戏的,访客不会取得任何游戏成就,也不可以发布游戏得分。开启访客模式的游戏,玩家只能与其它运行iOS 9的玩家进行游戏。
Model I/O模块介绍
Model I/O是用处理3D资源和数据的框架,我们可以通过Model I/O快速地加载和导出3D资源文件。另外,它集成在Xcode里面并且和可以非常容易地与GameKit API配合.它的主要功能特性如下:
- 支持多种3D文件格式的
- 可以对资源进行修改和Bake
- 支持3D模型三维像素化(Voxels)
- 集成Playground, Swift和Finder,并且能够在Finder的Quick look里面预览资源。
- 支持基于物理的材质和光照
总结
从本次苹果对游戏开发所做的改进来看,休闲社交游戏仍然是其主推的游戏类型。不过有了Metal的支持,在MacOS X开发AAA游戏也是完全有可能的。另外,主流的游戏厂商Unity和Unreal都声称直接了Metal,相信以后苹果生态圈里面会出现更多高品质的游 戏。
另外,随着虚拟现实和现实增强的火爆,相信在不久的将来,苹果也可能推出自家的VR设备。到时候,这些游戏开发框架和工具必将是您开发苹果VR游戏的首选。
参考链接