Почему пользовательский интерфейс зависает при закрытии ViewController с ARSCNView? - PullRequest
0 голосов
/ 03 февраля 2019

Я запускаю сеанс ARKit, где я размещаю узлы SceneKit.С каждым узлом я создаю новый контроллер представления и передаю его представление как содержимое узла следующим образом:

func createTextNode(anchor: ARCardAnchor) -> SCNNode? {
    let plane = SCNPlane()
    plane.height = 0.5
    plane.width = 0.5

    let sb = UIStoryboard(name: "Main", bundle: nil)
    let fCVC = sb.instantiateViewController(withIdentifier: "CardViewController") as! CardViewController


    plane.firstMaterial?.diffuse.contents = fCVC.view
    let cardNode = SCNNode(geometry: plane)
    cardNode.constraints = [billboardConstraint]
    return cardNode
}

Я добавляю узлы к сцене, используя следующий метод ARSCNViewDelegate и мой пользовательский ARCardAnchor (подклассARAnchor):

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {

    if let fcanchor = anchor as? ARCardAnchor {
        DispatchQueue.main.async {
            guard let n = self.nodeCreator.createTextNode(anchor: fcanchor) else { return }
            node.addChildNode(n)

        }
    }
}

Пока все работает и узлы размещены в трехмерном пространстве.Но когда я возвращаюсь к предыдущему View Controller, пользовательский интерфейс зависает, и я ничего не могу сделать.Я попытался использовать следующий сценарий раскрутки

@IBAction func goBackToPrevious(_ sender: Any) {
    sceneView.session.pause()
    self.performSegue(withIdentifier: "unwindToPrevious", sender: self)
}

и контроллер навигации, где я вытаскиваю контроллер сцены AR из стека.Каждый раз предыдущие контроллеры представления замораживаются.Нет ошибок в Xcode, приложение продолжает работать.Если я подожду ок.2 минуты я снова могу использовать экран.Если я не добавляю узлы с контроллерами представления в мою AR-сцену, все работает отлично.Мое единственное объяснение состоит в том, что UIThread перегружен при добавлении узлов, потому что он создает огромную утечку памяти где-то (чего я не нашел, несмотря на 10 часов отладки).Кто-нибудь имел подобный опыт и может подсказать как решить эту проблему?Что я могу сделать, чтобы отладить это и обеспечить плавную навигацию?

1 Ответ

0 голосов
/ 04 февраля 2019

Проблема заключалась в том, что я назначил свои пользовательские представления UIViewController непосредственно плоскостям узлов.Я предполагаю, что это создало ссылочные циклы, так как контроллеры представления содержали ссылки на объекты, которые я использовал в другом месте сцены.Я решил это, захватив изображение вида и присвоив его узлу.Похоже, что вообще опасно назначать UIViews напрямую узлам, потому что он предлагает циклы ссылок.Может быть, кто-то более квалифицированный по вопросам памяти и / или SceneKit может высказать свое мнение по этому поводу.

...