Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何取消分配RealityKit ARView()?_Swift_Swiftui_Arkit_Realitykit - Fatal编程技术网

Swift 如何取消分配RealityKit ARView()?

Swift 如何取消分配RealityKit ARView()?,swift,swiftui,arkit,realitykit,Swift,Swiftui,Arkit,Realitykit,我无法从内存中释放我的RealityKitARView() 我知道ARKit+SceneKit也存在(曾经?)类似的问题——有这样的解决方法: 不幸的是,这并不能解决我的问题 上述解决方案是通过手动删除所有“可疑”的内容来实现的。这正是我在更大范围内所做的: class ViewController_ARViewMemoryTest: UIViewController { var arView: ARView? init() { super.init(nibN

我无法从内存中释放我的RealityKit
ARView()

我知道ARKit+SceneKit也存在(曾经?)类似的问题——有这样的解决方法: 不幸的是,这并不能解决我的问题

上述解决方案是通过手动删除所有“可疑”的内容来实现的。这正是我在更大范围内所做的:

class ViewController_ARViewMemoryTest: UIViewController {

    var arView: ARView?

    init() {
        super.init(nibName: nil, bundle: nil)
        arView = ARView(frame: .zero)
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    deinit {
        doEverythingThatsNeeded()
    }

    public func doEverythingThatsNeeded() {
        self.arView?.session.pause()
        self.arView?.session.delegate = nil
        self.arView?.removeFromSuperview()
        // Quite a few more removals and resets here, ie. for Combines AnyCancellables
        self.arView = nil
    }

}
我也从外面给Doe打电话

aRViewMemoryTest?.doEverythingThatsNeeded()
aRViewMemoryTest?.arView = nil
aRViewMemoryTest = nil
这个问题似乎与我将ARView或UIViewController包装在SwiftUI
UIViewRepresentable
/
UIViewControllerRepresentable
中这一事实无关

我相信这一定是一个bug,几个月前我已经提交了一份报告。不过,我希望在苹果解决潜在问题之前,能找到一些解决办法


非常感谢

如果您使用的是SwiftUI,请尝试以下代码:

import SwiftUI
import RealityKit

struct ContentView : View {

    var body: some View {
        return ARViewContainer().edgesIgnoringSafeArea(.all)
    }
}

struct ARViewContainer: UIViewRepresentable {

    func updateUIView(_ uiView: ARView,
                       context: UIViewRepresentableContext<ARViewContainer>) {

        uiView.removeFromSuperview()
    }

    func makeUIView(context: Context) -> ARView {

        let arView = ARView(frame: .zero)
        let boxAnchor = try! Experience.loadBox()
        arView.scene.anchors.append(boxAnchor)
        return arView
    }
}

谢谢!我没有使用经验。但除此之外,我已经将我的代码简化为AppDelegate和您的类,加上一个将viewController设置为nil的按钮:仍然没有成功。嘿@AndyFedo,再次感谢。您能否评论一下
updateUIView(uiView:ARView,context:UIViewRepresentableContext)
方法在此上下文中扮演的角色?如果我在
makeUIView(context:context)->ARView(包含
ARView(frame:somethingNotZero)
中启动一个空的ARView,我会看到启动会话的内存开销约为400MB。到现在为止,一直都还不错。在消除内存消耗方面也没有成功…嗨@Andy,你在这方面成功了吗?嗨@HelloTimo。还没有。我不太确定我是在处理一个框架错误,还是只是做错了什么。欢迎您的任何意见。
import UIKit
import RealityKit

class ViewController: UIViewController {

    var arView: ARView? = ARView(frame: .zero)

    deinit {
        removingView()
    }

    func addingView() {
        self.arView?.frame = .init(x: 0, y: 0, width: 300, height: 700)
        self.view.addSubview(arView!)
    }

    func removingView() {
        self.arView?.session.pause()
        self.arView?.session.delegate = nil
        self.arView?.scene.anchors.removeAll()
        self.arView?.removeFromSuperview()
        self.arView?.window?.resignKey()
        self.arView = nil
    }

    override func viewDidLoad() {
        super.viewDidLoad()            
        addingView()

        let boxAnchor = try! Experience.loadBox()
        arView?.scene.anchors.append(boxAnchor)

        removingView()
    }
}