为什么调用 deinit 后 RealityKit 内存没有清除?

问题描述 投票:0回答:1

我无法从内存中释放我的 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
]

但还是没有运气。

swift arkit realitykit
1个回答
4
投票

在 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 { ... }

如果您需要更多信息,请阅读这篇文章了解详情。

© www.soinside.com 2019 - 2024. All rights reserved.