我无法从内存中释放我的 RealityKit
ARView()
。不幸的是,我知道 ARKit + SceneKit 存在similar issues with workarounds 并不能解决我的问题。
上面的解决方案通过手动删除所有“可疑”的东西来工作。这正是我在更广泛的范围内所做的:
func closeCurrentView(completion: (() -> Void)? = nil, isScanAnotherFloor: Bool = false) {
if backgroundRenderingID != UIBackgroundTaskIdentifier.invalid {
let app = UIApplication.shared
app.endBackgroundTask(self.backgroundRenderingID)
self.backgroundRenderingID = UIBackgroundTaskIdentifier.invalid
}
self.arView?.session.pause()
self.arView?.session.delegate = nil
self.arView?.scene.anchors.removeAll()
self.arView?.removeFromSuperview()
self.arView?.window?.resignKey()
self.arView = nil
}
内存将增加到 90MB 到 250MB,一旦调用
deinit
它将减少到 175MB,而不是清除所有内存。
同样在初始化的时候,我也设置了适当的选项。
arView?.renderOptions = [
.disableMotionBlur,
.disableDepthOfField,
.disablePersonOcclusion,
.disableGroundingShadows,
.disableFaceOcclusions,
.disableHDR
]
但还是没有运气。
在 Xcode 14.3 中测试
唉,RealityKit 2.0 / 1.0 开发人员无法从堆内存中释放
ARView
,因为苹果方面的实现质量很差。即使您在 SwiftUI 中将 arView
属性声明为 weak
,此实例将 立即 释放,因此您无法使用它。然而,在 UIKit 中,将 arView
声明为 weak
没有任何效果。
你还记得,ARC 最初是在 Objective-C 中引入的,后来在 Swift 中实现了。
weak
和 unowned
功能很可能由于某种原因没有为 ARView 实现,也许是因为 RealityKit 只为 Swift 量身定制——@objc
属性明确说明了这一点。看起来 ARView 弱引用没有被 ARC 跟踪(或者没有关联的Side Table)。
@available(macOS 10.15, iOS 13.0, *)
@objc open class ARView : ARViewBase { ... }
如果您需要更多信息,请阅读这篇文章了解详情。