Я работаю над приложением iOS AR, используя ARKit + SceneKit.Пользователь может выбирать из списка 3D-моделей, которые затем помещаются в AR-сцену.Это очень похоже на это пример приложения Apple ARKit .
Также важно отметить, что мое приложение содержит не только несколько моделей, но и сотни.Так что предварительная загрузка всех из них, вероятно, не будет хорошей идеей.При загрузке этих моделей по требованию мой код выглядит следующим образом:
let modelURL = Bundle.main.url(forRessource: "MyModel", ofType: "scn")
let referenceNode = SCNReferenceNode(url: modelURL)
DispatchQueue.global(qos: .background).async {
referenceNode.load()
self.prepare([referenceNode]) { _ in
self.scene.rootNode.addChildNode(referenceNode)
}
}
Вызов referenceNode.load()
не вызывает никаких проблем.Все это плавно обрабатывается в фоновом режиме.Но вызов self.prepare([referenceNode])
вызывает немедленное снижение частоты кадров до 0
в течение одной или двух секунд (в зависимости от самой модели).При удалении оператора prepare
происходит то же самое при вызове self.scene.rootNode.addChildNode(referenceNode)
.
Я заметил точно такое же поведение в примере приложения Apple .
Я нашел некоторыеподобные вопросы здесь, но не существует решения, которое работает при загрузке по требованию пользовательских 3D-моделей.
Не может ли SceneKit просто добавить новые узлы без замораживания или я что-то упустил?
Вопросы, связанные с данной:
Как добавить узлы SCNNode без блокировки основного потока?
Использование ЦП газа в фоновом потоке
SceneKit -Добавление нового SCNNode в сцену вызывает серьезную задержку