You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

visionOS退出ImmersiveSpace后USDZ模型资源未释放如何解决?

解决visionOS退出ImmersiveSpace后模型资源未释放的问题

问题根源

你遇到的内存泄漏问题,核心原因是没有主动清理RealityView中的实体引用,仅将appModel.root设为nil无法完全断开模型实体的强引用链,导致RealityKit相关资源无法被ARC自动回收。

解决方案

需要从两个关键环节断开强引用,确保模型资源被正确释放:

1. 关闭ImmersiveSpace前主动清空所有实体

在触发关闭ImmersiveSpace的逻辑中,先清空RealityContent里的所有实体,再将root置为nil:

修改ToggleImmersiveSpaceButton中的关闭分支代码:

case .open:
    appModel.immersiveSpaceState = .inTransition
    // 第一步:清空所有实体,断开模型的强引用
    appModel.root?.entities.removeAll()
    // 第二步:释放RealityContent引用
    appModel.root = nil
    await dismissImmersiveSpace()

2. 给RealityView添加销毁回调

在ImmersiveView的RealityView中加入onDisappear回调,确保ImmersiveSpace消失时,彻底清理所有实体资源:

修改ImmersiveView代码:

struct ImmersiveView: View {
    @Environment(AppModel.self) private var appVM

    var body: some View {
        RealityView { content in
            appVM.root = content
        } onDisappear: { content in
            // 当ImmersiveView消失时,主动清理所有实体
            content.entities.removeAll()
            appVM.root = nil
        }
    }
}

3. 验证内存释放

完成上述修改后,重新测试内存变化:

  • 退出ImmersiveSpace后,内存应回落至进入空白ImmersiveSpace之前的水平(接近56.8MB)
  • 使用内存分析工具确认模型相关的内存块已被回收

额外注意事项

  • 确保AppModel中没有额外的强引用持有模型实体(比如存储模型的数组、变量等),如果有,在关闭时也要同步清空
  • 避免在Task或异步回调中保留模型的强引用,确保所有引用链都能被及时断开

内容的提问来源于stack exchange,提问作者user27020255

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 01:55:54