Как избежать серьезного падения частоты кадров при использовании SCNSceneRender prepareObjects: withCompletionHandler: - PullRequest
0 голосов
/ 13 февраля 2019

Я работаю над приложением 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 в сцену вызывает серьезную задержку

...