既生瑜何生亮? 苹果 ARKit 与 RealityKit 带来的困惑

6,705 阅读5分钟

说明

苹果一直在 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 必然会更新大量新功能,用于新项目应该足够了。