Как освободить RealityKit ARView ()? - PullRequest
1 голос
/ 25 января 2020

Мне не удается освободить мой 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
    }

}

Я также вызываю doEverythingThatsNeeded () извне:

aRViewMemoryTest?.doEverythingThatsNeeded()
aRViewMemoryTest?.arView = nil
aRViewMemoryTest = nil

Кажется, проблема не зависит от факта что я завернул свой ARView или UIViewController в SwiftUI UIViewRepresentable / UIViewControllerRepresentable.

Я считаю, что это должно быть ошибкой, и я подал отчет за месяцы go. Однако я надеюсь на обходные пути, которые помогут, пока Apple не исправит потенциальную проблему.

Большое спасибо!

1 Ответ

1 голос
/ 25 января 2020

Попробуйте этот код, если вы используете 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
    }
}

... и этот код, если вы используете UIKit:

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()
    }
}

enter image description here

...