Я запускаю сеанс 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 часов отладки).Кто-нибудь имел подобный опыт и может подсказать как решить эту проблему?Что я могу сделать, чтобы отладить это и обеспечить плавную навигацию?