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
相关产品推荐
相关产品推荐

