简介
在此次 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 游戏的首选。
参考链接
- What’s New in SpriteKit
- Enhancements to SceneKit
- Going Social with ReplayKit and Game Center
- Introducing GameplayKit
- Deeper into GameplayKit with DemoBots
- Managing 3D Assets with Model I/O
- Metal Performance Optimization Techniques
- What’s New in Metal, Part 1
- What’s New in Metal, Part 2
感谢徐川对本文的审校。
给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ , @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群)。
评论