说明
苹果一直在 AR 方向上不断努力,2017 年就推出 ARKit,2019 年却又推出了 RealityKit 和 Reality Composer 编辑器。
也许很多 AR 开发者会感觉,ARKit 还没搞熟练呢,RealityKit 就来了,疑惑也随之而生:
- 是不是现在必须开始转移到 RealityKit 上去了?
- RealityKit 与 ARKit 有什么不同?
- 是不是两三年后,ARKit 就被放弃了,只能用 RealityKit 来开发了?
对比
目前,我在实际开发中已经有使用 ARKit 一年多的经验,最近,也看了 Raywenderlich 出的 RealityKit 新书,写了几个 Demo,试用了 Reality Composer。这些问题也在困扰着我,所以先对比一下:
项目 | ARKit | RealityKit |
---|---|---|
系统版本 | A9 芯片+,iOS 11.0+ | iOS 13.0+, macOS 10.15+, Mac Catalyst 13.0+ |
开发语言 | Objective-C, Swift | Swift |
渲染技术 | SceneKit(基于 OpenGL 或 Metal) | 未公开(基于 Metal) |
渲染特色 | 同SceneKit,可自定义光照及其他接口 | 真实感渲染, 仅支持PBR |
Shader支持 | 支持,OpenGL/Metal | 文档显示支持 shader,暂无实际使用方式 |
物理引擎 | 支持,且可深度自定义 | 支持拟真物理,少量参数可自定义 |
手势交互 | 不支持,需自己编写 | 支持移动,缩放,旋转等 |
动画 | 支持,CAAnimition, SCNAnimation,SCAction,模型自带动画等 | 支持移动,缩放,旋转等 Matrix 动画,模型自带动画 |
多人网络 | 支持,需自己编写 MultipeerConnectivity 相关代码 | 支持,自带 MultipeerConnectivity 相关属性与方法 |
音乐音效 | 3D音效,普通音效,背景音乐 | 3D音效,普通音效,背景音乐 |
贴图格式支持 | color (NSColor, UIColor, CGColorRef), image (NSImage, UIImage, CGImageRef),layer (CALayer), path (NSString or NSURL), SpriteKit scene (SKScene), texture (SKTexture, id or GLKTextureInfo), NSNumber, AVCaptureDevice/AVPlayer is supported on macOS 10.13, iOS 11 and tvOS 11. | 文档中material支持 (colors, shaders, textures, etc.),但目前只有SimpleMaterial``UnlitMaterial 两个具体的类 |
开发模式 | OOP+MVC | POP+ECS,原生支持Combine框架 |
可以看出来,目前的 RealityKit 框架,已经支持了 ARKit 在 AR 方面的几乎所有功能,同时更加简洁和高效,主要缺点就在于渲染方面存在不足。
这是因为,RealityKit 同样拥有处理 AR 数据和事件的 ARSession 类,才几乎完整继承了 AR 方面的能力;而缺点主要是由于 RealityKit 狠下心抛下了 SceneKit 这个渲染引擎导致的;同时自带了 MultipeerConnectivity , Combine框架支持,以及手势操作支持,使用起来确实方便不少。
RealityKit 抛下了 SceneKit 渲染引擎,带来的好处就是可以专注 Metal 技术与真实感渲染(PBR),画面显示更快更好,当然这也许和采用 ECS 模式也有一定关系。
RealityKit 中不再继续使用万能的 SCNNode 类,而是使用了 Entity 来组合需要的数据。不过带来的缺点就是,暂时不支持 Shader(文档中说明material
是可以用 shader 的,但是目前没有办法使用),同时贴图格式支持大幅缩水,不能使用 CALayer 和 AVPlayer 非常令人不满意,也许苹果今年的 WWDC2020 就会继续完善 RealityKit。
思考
ARKit 作为一个已经基本成熟的框架,目前在 AR 开发中使用广泛,开放的数据多,支持的渲染类型也比较多,现在看来仍是 AR 开发的首选。尤其是贴图类型的支持,对目前的 AR 开发非常重要,很多 AR 软件试图用一个平面来当做显示屏,并在上面展示信息,这对 RealityKit 来说目前还做不到。
这让大家有点疑惑:既生瑜何生亮?已经有了相当完善的 ARKit,何必为了一点点改进,和少许方便就重新开发一个 RealityKit 呢?更何况现在的 RealityKit 也有相当多的不足。
经过认真的思考,个人认为:ARKit 的历史包袱过于沉重,而且开发成本太高了;还有一个问题就是,ARKit 一旦基本成熟停止大幅添加新功能,就面临着被 Unity 等跨平台 AR 引擎追上的尴尬。
现在的 ARKit 之所以受到重视,就是因为它是苹果亲生的,新功能推出最早,适配最好,然而基于 SceneKit 的渲染在 Unity 面前反而是个短板,渲染再强大再方便也比不上 Unity 和 Unreal,而且 ARKit 不能跨平台。
RealityKit 和 Reality Composer 的推出,就是为了弥补这样的缺陷:利用 Reality Composer 降低开发门槛,加快开发进度。RealityKit 则轻装上阵,提高性能的同时加快进化脚步,为以后的 AR 眼镜做好准备。RealityKit 和 Reality Composer 同时还有跨平台(仅限苹果生态)的功能,iOS,iPadOS,macOS 都可以使用,也许还有未来的 glassOS。也许在未来,Reality Composer 会成为全功能、跨平台 AR 开发工具 IDE,而不只是 3D UI 编辑器,进而避免被 Unity 等替代的尴尬。
所以最后,目前 AR 开发学什么好呢,我的建议仍然是 ARKit,毕竟系统版本和开发语言兼容性都好,方便和现有项目集成,同时功能更完整,自定义程度高,同时官方功能更新快,文档多,bug 少。对于未来,AR 开发转向 RealityKit 似乎是无可避免,但是 ARKit 中的知识在 RealityKit 中大部分也是适用的,再学习的成本很低。而且这个过程不会太快,在苹果的 AR 眼镜出现前,ARKit 平台不会被放弃,生命力顽强。当然,如果是新项目,功能简单的话,尝试一下 RealityKit 也会不错,而且 WWDC2020 上,RealityKit 必然会更新大量新功能,用于新项目应该足够了。