利用 visionOS 27 打造新一代体验
Build next-generation experiences with visionOS 27
2026年6月10日
一句话判断
Foveated Streaming(注视点流式传输)框架的推出是这场 Session 最值得关注的事,Apple 终于承认了”纯靠头显 M5 芯片搞不定重度 3D”的现实,把 PC 串流做成了官方一等公民。
这场 Session 讲了什么
过去两年,想在 visionOS 上做重度体验,要么硬着头皮用 RealityKit 原生重写,要么忍受 iOS 兼容模式的平庸。今年 Apple 摊牌了,直接划出”第三条路”:用 Spatial Preview(空间预览)把 Mac 上的 3D 资产直接投屏到头显里调优,用 Foveated Streaming 把 PC 上的重度渲染画面通过眼动追踪压缩串流过来。
除了这条救命稻草,RealityKit 补齐了物理空间光照(Projective Textures API)和布料模拟,Reality Composer Pro 3 则大改版,加入了 Script Graph(脚本图)和 AI 助手。这次更新对工业仿真、重度游戏开发者以及技术美术(TA)来说是实打实的减负,不用再为了一个交互原型去死磕 Swift 代码了。
值得深挖的点
Foveated Streaming:用眼球欺骗带宽
做 PC 到 VR 的串流不新鲜,Steam Link 和 Virtual Desktop 早就在做了。但 Apple 搞 Foveated Streaming 的杀手锏是硬件级眼动追踪。传统的串流是把整个 4K 画面无差别压缩,带宽压力极大。Foveated Streaming 利用 Vision Pro 的眼动数据,只对你视线焦点区域进行高画质渲染和传输,周边视觉区域大幅降低分辨率。
这个设计的 trade-off 很明显:它极度依赖眼动追踪的低延迟。如果眼球转动比画面更新快,用户就会看到边缘画质的”果冻感”或模糊。但从工程角度看,这是目前唯一能在 Wi-Fi 6/7 环境下,把 PC 端 Unreal Engine 5 的 Nanite 场景原生塞进 Vision Pro 的可行方案。对于做数字孪生、汽车设计(像 Kia 和 Autodesk VRED 的案例)的团队来说,这比把几百万面的模型烘焙成低模塞进 RealityKit 要优雅得多。
Reality Composer Pro 3:把 TA 从 Xcode 里捞出来
之前的 Reality Composer Pro 更像是一个静态场景摆放工具,稍微复杂点的逻辑就得回 Xcode 写 Swift。RCP 3 加入的 Script Graph(脚本图)和 Animation Graph(动画图)直接改变了工作流。TA 和美术现在可以用节点连线的方式处理点击事件、角色寻路(Navigation Meshes)和状态机,而且支持在头显里实时热更新预览。
加上 AI 助手可以直接通过文本生成带材质的 3D 占位符(比如生成一碗干果或蜡烛),这极大地加速了灰盒测试(Blockout)阶段。Apple 这么做的意图很明确:降低空间计算原型的验证成本。坑在于,节点图一旦逻辑变复杂,维护起来会比纯代码更灾难,大型项目还是得老老实实写 Swift 和自定义 Script Graph 节点。
代码片段
1. 物理空间光照 (Projective Textures)
场景:在 RealityKit 中为聚光灯添加纹理,模拟彩色玻璃或水下焦散效果。
import RealityKit
// 创建一个聚光灯实体
let spotlight = Entity()
var lightComponent = SpotLightComponent()
lightComponent.intensity = 5000
lightComponent.innerAngleInDegrees = 30
lightComponent.outerAngleInDegrees = 45
// 加载投影纹理(比如彩色玻璃图案)
if let projectionTexture = try? TextureResource.load(named: "stained_glass") {
// 将纹理应用到聚光灯的投影属性上
lightComponent.projectedTexture = projectionTexture
}
spotlight.components.set(lightComponent)
// 调整灯光角度以投射到地面
spotlight.look(at: [0, -1, 0], from: [0, 2, 0], relativeTo: nil)
坑:投影纹理的分辨率如果太低,边缘会出现明显的像素锯齿,建议至少使用 2K 以上的 HDR 纹理,并注意控制灯光的衰减范围(Attenuation Radius)以避免性能暴降。
2. macOS 端使用 Spatial Preview 推送 3D 资产
场景:在 Mac App 中选中一个 USDZ 模型,直接推送到 Vision Pro 的 Shared Space(共享空间)中进行 1:1 预览。
import SwiftUI
import SpatialPreview
struct AssetPreviewView: View {
@State private var isPreviewing = false
let modelURL = Bundle.main.url(forResource: "concept_car", withExtension: "usdz")!
var body: some View {
Button("在 Vision Pro 中预览") {
Task {
// 配置空间预览会话
let configuration = SpatialPreview.Configuration(
contentURL: modelURL,
contentType: .model3D
)
// 允许通过 SharePlay 与团队成员同时查看
configuration.supportsSharePlay = true
do {
try await SpatialPreview.start(configuration: configuration)
isPreviewing = true
} catch {
print("启动预览失败,检查头显是否在同一网络: \(error)")
}
}
}
}
}
坑:Mac 和 Vision Pro 必须登录同一个 iCloud 账号且在同一局域网下,如果是企业级证书分发的 Mac App,还需要在 Entitlements 里额外配置 Spatial Preview 权限。
3. 配置 Foveated Streaming 的注视点渲染
场景:在自定义渲染引擎中,接收 Vision Pro 传来的眼动数据并配置注视点渲染参数。
import CompositorServices
import Spatial
// 自定义渲染层配置
struct FoveatedLayerConfiguration: CompositorLayerConfiguration {
func makeConfiguration(capabilities: LayerRenderer.Capabilities, configuration: inout LayerRenderer.Configuration) {
// 启用注视点渲染(Foveation)
configuration.foveationEnabled = true
// 设置中央高分辨率区域的比例
// 值越小,中心清晰区域越小,周边模糊区域越大,越省带宽
configuration.foveationScaling = 0.6
// 开启静态注视点(适用于视频流或不需要每帧重算的场景)
configuration.isStaticFoveation = false
}
}
坑:foveationScaling 设得太小(比如低于 0.4)会导致用户眼球快速转动时,周边视觉的模糊区域来不及切换,产生强烈的眩晕感。建议从 0.6 开始微调。
最佳实践
已有 Mac/PC 工业软件或重度游戏项目的团队,直接放弃原生移植的幻想,走 Foveated Streaming 这条路。把头显纯粹当成一个带眼动追踪的 4K 显示器,把算力留给 PC 端。
新项目如果打算原生开发,强制要求 TA 和美术在 Reality Composer Pro 3 里用 Script Graph 跑通交互原型,再让程序员用 Swift 重写核心逻辑。千万不要让程序员直接在 Xcode 里盲调 3D 场景的位置和动画。
使用高斯泼溅(Gaussian Splatting)扫描真实物体时,务必在后期清理掉背景噪点,否则在 Vision Pro 的高亮环境下,那些半透明的噪点会像灰尘一样飘在用户眼前,极其破坏沉浸感。
还有什么值得关注
- ARKit 物体追踪下放 iOS:以前只能在头显里做的高帧率物体追踪,现在 iPhone 也能用了,做 AR 电商展示的团队可以直接复用这套 API。
- 空间配件(Spatial accessories)支持:官方终于开放了第三方手柄接入,比如 PSVR2 Sense 控制器,做硬核 VR 游戏的不用再捏空气了。
- Web Environments 默认开启:Safari 窗口变得更宽,且 Web 环境默认打开,WebXR 开发者迎来了真正的流量入口。