VisionOS是苹果为Vision Pro头显打造的操作系统,也是第一个真正面向空间计算的操作系统。
作为一个开发者,我从VisionOS发布之初就开始研究它。经过一段时间的开发和学习,我对VisionOS的底层机制有了比较深入的理解。这篇文章,我想从渲染架构、交互模型、空间布局、性能优化等几个方面,深入剖析VisionOS的开发原理。
希望这篇文章能帮你更好地理解VisionOS,开发出更好的空间计算应用。
VisionOS的整体架构
先说说VisionOS的整体架构。
VisionOS是基于iOS衍生出来的,但它和iOS有很大的不同。iOS是为二维屏幕设计的,而VisionOS是为三维空间设计的。它的核心思想,是把数字内容和真实世界融合在一起。
VisionOS的架构,可以分为几个层次:
最底层是硬件层,包括Vision Pro的硬件:双4K micro-OLED显示屏、眼动追踪系统、手部追踪系统、空间音频系统、各种传感器(陀螺仪、加速度计、激光雷达等)。
往上是系统层,包括VisionOS内核、渲染引擎、交互引擎、空间音频引擎、感知系统等。这些系统负责处理硬件数据,渲染画面,识别手势和眼动,理解空间环境。
再往上是框架层,包括SwiftUI、RealityKit、ARKit、Metal等开发框架。开发者通过这些框架来构建应用。
最上层是应用层,就是用户看到的各种应用。
VisionOS的一个核心特点,是"原生空间应用"和"兼容应用"并存。原生空间应用是用SwiftUI和RealityKit开发的,可以充分利用空间计算的能力。兼容应用是从iOS/iPadOS移植过来的,以2D窗口的形式显示在空间中,功能和iPad应用差不多。
渲染架构
渲染是VisionOS最核心的部分,也是和传统平台差异最大的地方。
VisionOS用的是分层渲染架构。每一个应用的内容,都渲染在一个独立的图层(Layer)上。系统把所有应用的图层合成在一起,再加上真实世界的画面(通过摄像头透视),最终显示在屏幕上。
这种架构的好处是,每个应用的渲染是独立的,一个应用卡顿不会影响其他应用。而且,系统可以对每个图层进行独立的变换和合成,实现空间效果。
VisionOS的渲染,有几个关键技术:
第一个是注视点渲染(Foveated Rendering)。因为人眼的中央凹(视网膜中心)分辨率最高,周边分辨率低。VisionOS利用眼动追踪,知道用户在看哪里,然后在注视点区域用高分辨率渲染,周边区域用低分辨率渲染。这样可以大幅降低渲染负载,而用户几乎感觉不到差异。
注视点渲染是VisionOS性能的关键。如果没有注视点渲染,以双4K的分辨率,实时渲染是非常困难的。
第二个是动态注视点渲染。除了静态的注视点渲染,VisionOS还会根据内容动态调整。比如,用户在看文字的时候,文字区域会用更高的分辨率;在看快速移动的物体时,会提高帧率。
第三个是空间合成。系统把所有应用的图层,根据它们在空间中的位置,合成到最终的画面中。这个合成过程,考虑了深度、遮挡、光照等因素,让数字内容看起来像是真实存在于空间中的。
第四个是运动预测。因为头显有延迟,从用户转头到画面更新,会有一定的延迟。如果延迟太高,用户会感到眩晕。VisionOS通过运动预测,根据头显的运动数据,预测下一帧用户的视角,提前渲染,降低感知延迟。
交互模型
VisionOS的交互模型,和传统的鼠标键盘、触摸屏都不一样。它的核心交互方式是:眼动追踪 + 手势识别。
基本的交互逻辑是:用眼睛看,用手指捏。你看着某个元素,它会高亮;然后拇指和食指捏一下,就相当于点击。这种交互方式,叫做"间接交互",你不需要触摸屏幕,只需要用眼睛看和手指捏。
除了基本的点击,VisionOS还支持更多的手势:
- 捏合并拖动:相当于拖拽。
- 双手捏合:缩放和旋转。
- 手腕轻扫:返回、切换应用。
- 空中打字:在虚拟键盘上打字。
VisionOS的交互,有几个设计原则:
第一个是,眼动是指针。你的眼睛就是鼠标指针,你看哪里,指针就在哪里。这比用手去指要快得多,也自然得多。
第二个是,手势是确认。捏合手势相当于鼠标点击,是一个确认动作。因为眼动很容易移动,如果眼睛看到就触发,会误操作很多。所以需要用手势来确认。
第三个是,直接交互和间接交互结合。对于2D窗口里的内容,用间接交互(眼看+捏合)。对于3D物体,可以用直接交互,就是用手直接去抓、去移动、去旋转。
第四个是,反馈很重要。因为用户没有触摸到实体,所以需要视觉和听觉反馈来确认操作。比如,元素被注视时会高亮,捏合时会有缩放效果和点击音效。
VisionOS还支持其他交互方式,比如语音输入、外接键盘鼠标、游戏手柄等。但核心的交互,还是眼动+手势。
空间布局
VisionOS的另一个核心概念,是空间布局。应用不再局限于一个矩形屏幕,而是可以存在于三维空间中。
VisionOS的空间布局,有几个基本概念:
第一个是窗口(Window)。窗口是2D内容的载体,就像iPad上的窗口一样,但它可以放在空间中的任意位置,也可以调整大小。用户可以把窗口放在自己面前,也可以放在旁边。
第二个是体积(Volume)。体积是3D内容的载体,它是一个三维的区域,里面可以放3D物体。用户可以从不同角度看体积里的内容,也可以用手直接和3D物体交互。
第三个是空间(Space)。空间是应用可以占据的整个环境。默认情况下,应用在共享空间中运行,和其他应用共存,用户可以看到真实世界。应用也可以请求进入全屏空间,这时候真实世界被隐藏,应用可以完全控制用户看到的环境。
空间布局的设计,有几个原则:
第一个是,内容要在舒适的范围内。用户的舒适观看区域,是正前方大约60度的范围,距离1到3米。太近了会有压迫感,太远了看不清。重要的内容,应该放在这个舒适区域内。
第二个是,尊重用户的空间。应用不应该占据用户的整个空间,应该给用户留有余地。不要把内容放得太大、太近,让用户感到压抑。
第三个是,稳定很重要。空间中的内容,应该保持稳定,不要随着用户的头部移动而移动(除非是有意的设计)。如果内容不稳定,用户会感到眩晕。
第四个是,利用深度。空间计算的优势就是有深度。可以通过深度来组织内容,比如重要的内容放前面,次要的放后面。也可以通过遮挡来营造空间感。
RealityKit和SwiftUI
开发VisionOS应用,主要用两个框架:SwiftUI和RealityKit。
SwiftUI用来构建2D界面,就是窗口里的内容。它和iOS上的SwiftUI基本一样,但增加了一些空间计算相关的API,比如窗口的摆放、手势的处理等。
RealityKit用来构建3D内容,就是体积里的3D物体和场景。RealityKit是一个3D渲染引擎,支持3D模型加载、物理模拟、粒子效果、动画等。
在VisionOS中,SwiftUI和RealityKit是紧密结合的。你可以在SwiftUI的视图中嵌入RealityKit的3D内容,也可以在3D场景中添加SwiftUI的2D界面。
RealityKit的几个核心概念:
第一个是实体(Entity)。实体是3D场景中的基本对象,比如一个模型、一个灯光、一个碰撞体。实体可以有子实体,形成层级结构。
第二个是组件(Component)。组件是附加在实体上的功能,比如模型组件、物理组件、碰撞组件、动画组件。RealityKit用的是ECS(实体组件系统)架构,这种架构灵活且高效。
第三个是锚点(Anchor)。锚点是3D内容在空间中的固定点。可以把内容锚定在平面上(比如桌面、墙面),也可以锚定在图像上(识别到特定图片后显示内容),还可以锚定在脸上(比如人脸特效)。
第四个是场景(Scene)。场景是所有实体和锚点的容器。一个应用可以有多个场景,每个场景对应不同的内容。
性能优化
VisionOS应用的性能优化,非常重要。因为头显的渲染负载很高,如果性能不好,会导致帧率下降,用户会感到眩晕。
VisionOS的性能优化,有几个关键点:
第一个是,保持90fps。VisionOS的屏幕刷新率是90Hz,应用需要保持90fps的帧率,才能让用户感到流畅。如果帧率下降,用户会明显感觉到卡顿,甚至眩晕。所以,性能优化的首要目标,就是保持90fps。
第二个是,减少Draw Call。Draw Call是CPU向GPU发送的渲染指令,Draw Call越多,CPU负载越高。要尽量减少Draw Call,比如合并网格、使用实例化渲染、减少材质数量。
第三个是,控制多边形数量。3D模型的多边形越多,GPU负载越高。要尽量使用低多边形模型,或者用LOD(细节层次)技术,远处的物体用低多边形模型。
第四个是,合理使用注视点渲染。注视点渲染能大幅降低负载,但需要正确使用。要确保重要的内容在注视点区域,不重要的内容可以放在周边。
第五个是,优化纹理。纹理的大小和格式对性能影响很大。要使用合适大小的纹理,不要用过大的纹理。使用压缩纹理格式,减少显存占用和带宽。
第六个是,避免动态修改场景。频繁地添加、删除、移动实体会导致性能下降。尽量在加载时就构建好场景,运行时少做修改。
第七个是,合理使用物理模拟。物理模拟很耗性能,不要对太多物体开启物理模拟。只对需要的物体开启,并且合理设置物理参数。
空间音频
VisionOS的另一个重要特性,是空间音频。
空间音频,就是让声音听起来像是来自空间中的特定位置。比如,你左边有一个窗口,那个窗口发出的声音,就会从左边传来。你转头看那个窗口,声音的方向也会跟着变化。
VisionOS的空间音频,是通过头相关传输函数(HRTF)实现的。系统根据用户头部的形状和耳朵的形状,对声音进行处理,让大脑误以为声音来自特定的方向。
空间音频的开发,主要用AVFoundation和RealityKit的音频功能。你可以给3D实体添加音频源,设置音频的位置、方向、衰减等参数。系统会自动根据用户的位置和朝向,处理音频的空间效果。
空间音频的设计原则:
第一个是,用声音引导注意力。可以用空间音频来引导用户看向某个方向,比如有通知的时候,从那个方向发出声音。
第二个是,不要过度使用。空间音频虽然很酷,但不要到处都用。太多的空间音频会让用户感到混乱和疲劳。
第三个是,考虑环境。空间音频的效果,和用户的环境有关。在嘈杂的环境中,空间音频的效果会打折扣。
写在最后
VisionOS是一个全新的平台,它的开发原理和传统平台有很大的不同。理解它的渲染架构、交互模型、空间布局、性能优化等底层机制,是开发好VisionOS应用的基础。
空间计算是一个很有前景的方向,VisionOS是目前最成熟的空间计算操作系统。虽然现在Vision Pro的价格还很高,用户量还不大,但随着技术的发展和价格的下降,空间计算一定会越来越普及。
作为开发者,提前学习和掌握VisionOS的开发,是一个很好的投资。也许在未来,空间计算应用会像现在的手机应用一样普及。
这篇文章只是对VisionOS开发原理的一个初步剖析,很多细节还需要在实际开发中去体会和理解。如果你也在学习VisionOS开发,欢迎一起交流。
愿我们都能在空间计算这个新领域,创造出有价值的应用。
评论(0)
暂无评论,快来抢沙发~
评论功能仅对会员开放,请先登录
登录