WWDC Quick Look 💓 By SwiftGGTeam
Use foveated streaming to bring immersive content to visionOS

Use foveated streaming to bring immersive content to visionOS

观看原视频

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 View
  • ReopenMainWindowView 示例展示了如何在 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 模式:

  1. Vision Pro 发起连接请求
  2. 如果未配对,请求 pairing barcode
  3. Barcode 包含 client token 和连接证书哈希(由 NVIDIA CloudXR SDK 提供)
  4. 配对完成后,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

评论

GitHub Issues · utterances