如何在SwiftUI中异步加载Reality Composer场景?
异步加载RealityKit大场景方案
你的同步加载方式会在初始化视图时直接阻塞主线程加载大模型,很容易导致UI卡顿甚至无响应,完全可以改成异步加载。下面是修改后的代码:
struct DemoView: View { @State private var arView = ARView(frame: .zero) @State private var scene1: Experience1.Scene1? // 改为可选类型,初始为nil @State private var loadError: Error? // 捕获加载错误 var body: some View { ZStack { ARViewContainer(arView: $arView, scene1: $scene1) .ignoresSafeArea() VStack { if let error = loadError { Text("加载失败: \(error.localizedDescription)") .foregroundColor(.red) } Button("play") { guard let scene = scene1 else { return } scene.notifications.replay.post() } .disabled(scene1 == nil) // 未加载完成时禁用按钮 } } .onAppear { // 视图出现时启动异步加载任务 Task { do { scene1 = try await Experience1.loadScene1() loadError = nil } catch { loadError = error print("场景加载失败: \(error)") } } } } } struct ARViewContainer: UIViewRepresentable { @Binding var arView: ARView @Binding var scene1: Experience1.Scene1? func makeUIView(context: Context) -> ARView { return arView } func updateUIView(_ uiView: ARView, context: Context) { // 场景加载完成后,确保只添加一次到AR视图 guard let scene = scene1, !uiView.scene.anchors.contains(scene) else { return } uiView.scene.anchors.append(scene) } }
关键修改说明:
- 将
scene1改为可选类型,异步加载完成前保持nil,避免阻塞主线程 - 使用
async/await异步加载场景,Xcode自动生成的Experience1类会提供异步版本的loadScene1()方法 - 通过
onAppear启动加载任务,成功后更新场景状态,失败则记录错误 - 在
ARViewContainer的updateUIView中处理场景添加逻辑,避免重复添加 - 按钮添加禁用状态,防止未加载完成时触发无效操作
内容的提问来源于stack exchange,提问作者kkk
相关产品推荐
相关产品推荐

