Highlight
Apple 在 visionOS 26.4 引入 Foveated Streaming 框架,让 Vision Pro 通过 Wi-Fi 无线串流 PC 上的 OpenXR 内容。系统利用眼动追踪实现动态注视点压缩,并内置 NVIDIA CloudXR 协议,开发者一天内即可让现有 OpenXR 应用跑在 Vision Pro 上。
核心内容
一个真实的痛点:PC 级 VR 内容被困在头显里
很多沉浸式应用需要 PC 的算力。飞行模拟、赛车游戏、工业级 3D 可视化——这些场景的模型复杂度和物理计算量,远超一体式头显能承载的范围。
以前的做法是给 PC 配一个 VR 头显,用线缆连接。用户被绑在电脑旁边,活动范围受限。内容生态也被割裂:OpenXR 应用跑在 PC VR 生态里,visionOS 的 ARKit、SwiftUI、RealityKit 这些能力完全用不上。
Apple 的做法:无线串流 + 系统级注视点优化
Foveated Streaming 解决两个问题。
第一,无线串流。visionOS 内置 NVIDIA CloudXR SDK,PC 和 Vision Pro 之间通过 Wi-Fi 传输视频和音频。不需要线缆,可以走家庭局域网,也可以走云端。
第二,动态注视点压缩。Vision Pro 的眼动追踪硬件实时知道用户在看哪里。系统对视线中心区域传输高分辨率画面,周边区域降低精度。压缩逻辑完全由 visionOS 处理,开发者不需要介入。
(00:26)
已有应用验证了这个路线
Laminar Research 的 X-Plane 12 用这套方案把 PC 飞行模拟带到 Vision Pro。visionOS 端的 App 用 ARKit 识别物理驾驶舱的位置,串流过来的虚拟画面和真实设备对齐。用户能看到自己的手握着真实的操纵杆,同时眼前是完整的虚拟座舱和窗外景色。
iRacing 的赛车模拟也用了同样的方式。ARKit 手部追踪把真实方向盘的位置同步到虚拟驾驶舱,用户低头能看到自己的手抓着虚拟方向盘。
Autodesk VRED 通过 Innoactive 的集成进入 Vision Pro。起亚的设计师用它在真实比例下查看汽车模型,细节精度达到工程级要求。
(01:04)
不只是串流,而是和 visionOS 原生能力混合
Foveated Streaming 不是简单的”视频播放器”。串流内容可以和 SwiftUI 界面、RealityKit 渲染、ARKit 空间感知叠加使用。
举个例子:你可以在串流的 OpenXR 游戏画面上方,用 SwiftUI 做一个关卡选择菜单。菜单是原生 visionOS 控件,支持空间手势。用户选好关卡后,通过 Message Channel 把指令发给 PC 端的 OpenXR 应用。
(03:13)
详细内容
系统架构:两端各需要做什么
整个系统分两部分:
- PC 端(Streaming Endpoint):OpenXR 应用 + NVIDIA CloudXR Runtime + Apple Foveated Streaming Protocol 实现
- Vision Pro 端(Receiver App):使用
FoveatedStreaming框架建立连接、显示内容、集成 visionOS 原生能力
(04:10)
Apple 在 GitHub 上提供了完整的端到端示例代码,包含 Windows 端的协议参考实现和 OpenXR 示例应用。按照文档指引,一个下午可以搭通整个链路。
建立连接:Session 式 API
visionOS 端的核心类是 FoveatedStreamingSession。
import SwiftUI
import FoveatedStreaming
struct ConnectView: View {
let session: FoveatedStreamingSession
var body: some View {
Button("Connect") {
Task {
try await session.connect()
}
}
}
}
(06:03)
关键点:
FoveatedStreamingSession是 session-based API 的入口connect()是异步方法,内部处理完整的配对和连接流程- 调用后框架自动扫描局域网内的可用 endpoint
- Vision Pro 和 endpoint 首次配对时,PC 端显示 QR 码,用户用视线扫描完成配对
在 ImmersiveSpace 中显示串流内容
连接建立后,把 session 交给 ImmersiveSpace 即可显示串流画面。
import SwiftUI
import FoveatedStreaming
@main struct FoveatedStreamingSampleApp: App {
private let session = FoveatedStreamingSession()
var body: some SwiftUI.Scene {
ImmersiveSpace(foveatedStreaming: session)
}
}
(06:44)
关键点:
ImmersiveSpace(foveatedStreaming:)是 SwiftUI 为 Foveated Streaming 提供的专用构造器- 不需要手动管理视频纹理或渲染循环,框架内部处理
- 串流内容作为 ImmersiveSpace 的底层画面,SwiftUI 和 RealityKit 内容可以叠加在上方
混合 SwiftUI 内容
实际应用通常需要在串流画面上叠加原生 UI。
import SwiftUI
import FoveatedStreaming
@main struct FoveatedStreamingSampleApp: App {
private let session = FoveatedStreamingSession()
private let appModel = AppModel()
var body: some SwiftUI.Scene {
Window("Main", id: appModel.mainWindowId) {
ContentView(session: session)
.environment(appModel)
.environment(session)
}
ImmersiveSpace(foveatedStreaming: session) {
SpatialContainer {
ReopenMainWindowView().environment(appModel)
TransformStreamWidgetView().environment(session)
}
}
}
}
(06:55)
关键点:
Window场景可以独立存在,用于主菜单、暂停/恢复控制等ImmersiveSpace内部用SpatialContainer包裹多个 SwiftUI ViewReopenMainWindowView示例展示了如何在 ImmersiveSpace 内提供”重新打开主窗口”的控件TransformStreamWidgetView可以访问 session 状态,显示连接信息或调试数据- 支持 progressive immersion 等所有 SwiftUI 沉浸样式
混合 RealityKit 内容
如果需要在串流画面上叠加 3D 物体,用 RealityView。
import SwiftUI
import RealityKit
import FoveatedStreaming
@main struct FoveatedStreamingSampleApp: App {
private let session = FoveatedStreamingSession()
private let appModel = AppModel()
var body: some SwiftUI.Scene {
ImmersiveSpace(foveatedStreaming: session) {
RealityView { content in
// 在这里添加 RealityKit 实体
}
}
}
}
(13:42)
关键点:
RealityView和串流内容在同一 ImmersiveSpace 中自动合成- 如果 OpenXR 应用提供了深度缓冲和 alpha 通道,RealityKit 物体和串流物体可以正确遮挡
- 这是把物理世界的 ARKit 数据(如手部、桌面位置)和虚拟串流内容融合的关键机制
PC 端协议:Foveated Streaming Protocol
PC 端需要实现 Apple 定义的 Foveated Streaming Protocol。这是一个轻量级 TCP 连接,独立于视频流,负责认证和状态同步。
协议消息用 JSON 编码,采用 request-acknowledge 模式:
- Vision Pro 发起连接请求
- 如果未配对,请求 pairing barcode
- Barcode 包含 client token 和连接证书哈希(由 NVIDIA CloudXR SDK 提供)
- 配对完成后,endpoint 报告内容就绪,视频流开始
(08:30)
需要注意的状态管理:
- 用户摘下 Vision Pro 进入睡眠时,系统会通知 endpoint 暂停串流
- 睡眠期间所有连接断开
- Endpoint 应保持可用,用户重新戴上设备后可以重连
输入数据自动透传
Vision Pro 的手部追踪、控制器位置、麦克风数据,通过 CloudXR 自动映射为 OpenXR 输入。PC 端的 OpenXR 应用不需要额外适配。
具体支持:
- OpenXR Hand Tracking 扩展
- PlayStation VR2 Sense 控制器
- 控制器和手部追踪数据已内置,无需额外代码
Apple 建议 OpenXR 应用提供深度缓冲(depth buffer)和 alpha 通道,以获得最佳体验。
(10:40)
Message Channel:两端通信
Foveated Streaming 框架提供 Message Channel API,让 visionOS App 和 PC 端 OpenXR 应用双向通信。
visionOS 端通过 FoveatedStreamingSession 的 message channel API 发送数据。PC 端通过 CloudXR 提供的 OpenXR 扩展接收。消息内容是纯二进制数据,格式由应用自定义。
典型用途:
- visionOS 端用 SwiftUI 做菜单,选中后发送关卡加载指令
- PC 端回传加载进度
- visionOS 端用 ARKit 获取物理空间定位,通过 message channel 同步给 PC,让虚拟内容和真实环境对齐
FoveatedStreamingSession 还提供了 OpenXR 坐标系和 ARKit 坐标系之间的转换 API。
(12:06)
性能调试工具
Xcode 提供了 Foveated Streaming Instrument,可以测量:
- 串流带宽
- Pose latency(姿态延迟)
- 帧率
用这个工具可以诊断串流体验中的性能问题。
(11:34)
核心启发
把现有 PC VR 游戏移植到 Vision Pro
做什么:如果你已经有基于 OpenXR 的 PC VR 游戏或应用,一天内就能让它无线运行在 Vision Pro 上。
为什么值得做:Vision Pro 的显示分辨率和眼动追踪精度远超大多数 PC VR 头显。加上无线自由和 visionOS 的原生 UI 能力,体验会有质的提升。
怎么开始:下载 Apple GitHub 上的 StreamingSession 示例,把 Windows 端的协议参考实现集成到你的 OpenXR 应用里。visionOS 端直接用 sample code 改界面。
物理设备 + 虚拟画面的混合模拟器
做什么:参考 X-Plane 12 的做法,做一个需要物理外设(方向盘、飞行摇杆、乐器)的模拟应用。真实设备由 ARKit 识别,虚拟画面从 PC 串流。
为什么值得做:这类应用对物理交互 fidelity 要求很高,一体式头显的算力不够。Foveated Streaming 让 PC 负责渲染,Vision Pro 负责空间感知和显示,各做擅长的事。
怎么开始:用 ARKit 的平面检测和物体追踪定位物理外设,通过 Message Channel 把坐标同步给 PC 端 OpenXR 应用。FoveatedStreamingSession 有现成的坐标系转换 API。
工业设计评审工具
做什么:参考 Autodesk VRED 的集成,做一个让设计师在真实比例下查看大型 3D 模型的工具。模型在 PC 上渲染,Vision Pro 负责显示和空间定位。
为什么值得做:汽车、建筑、航空领域的 CAD 模型通常几十 GB,无法直接在头显上加载。PC 端有专业显卡和足够内存,串流是合理方案。
怎么开始:PC 端用 OpenXR 加载 CAD 模型,visionOS 端用 ARKit 识别会议室或展厅的地面和墙面,通过 Message Channel 同步空间锚点,让模型”站”在真实地面上。
多人协作的混合现实会议室
做什么:在 Vision Pro 上显示从云端 PC 串流的共享 3D 场景,每个参与者用自己的 Vision Pro 看到相同内容,但视角独立。
为什么值得做:云端 PC 可以渲染超大规模场景(如城市级数字孪生),多个 Vision Pro 同时接入。每个人的眼动追踪独立优化自己的画面,互不干扰。
怎么开始:云端部署 NVIDIA CloudXR 服务器,每个 Vision Pro 运行 Foveated Streaming receiver App。用 Message Channel 同步用户的位置和交互操作。
5. 用 SwiftUI 叠加层做串流游戏的 HUD 和菜单
做什么:在串流的 OpenXR 游戏画面上方,用 SwiftUI 构建关卡选择、设置面板、好友列表等 UI 层。原生 SwiftUI 控件支持空间手势,和串流画面无缝融合。
为什么值得做:纯 OpenXR 应用的 UI 通常用自绘纹理实现,在 Vision Pro 上看起来格格不入。用 SwiftUI 叠加层可以做出符合 visionOS 设计语言的界面,同时通过 Message Channel 把用户操作发给 PC 端游戏。
怎么开始:在 ImmersiveSpace(foveatedStreaming: session) 内部用 SpatialContainer 包裹 SwiftUI View,按钮点击时通过 FoveatedStreamingSession 的 message channel API 发送二进制指令给 PC 端。
关联 Session
- Build immersive environments for games and media — 学习如何构建 visionOS 的沉浸式环境,可与串流内容结合
- Compose interactive 3D content in RealityKit — RealityKit 和 Foveated Streaming 内容混合渲染的技术细节
- Create 3D models for your spatial app — 3D 模型优化,提升串流场景的视觉质量
- Develop your spatial app with SwiftUI — SwiftUI 在 visionOS 中的空间界面开发,用于构建 Foveated Streaming 的 UI 叠加层
评论
GitHub Issues · utterances