SCNView в первый раз визуализирует сцену очень медленно

Я хочу динамически загружать файлы Collada в SceneKit во время выполнения. Я использовал copySceneKitAssetst для создания файла .DAE и размещения его на моем сервере. Приложение может загрузить его с сервера и использовать этот файл для запуска SCNScene (см. http://www.the-nerd.be/2014/11/07/dynamically-load-collada-files-in-scenekit-at-runtime/ < / а>).

При выполнении "./copySceneKitAssets" ошибки отсутствуют, и модели могут отображаться правильно. Я позвонил [scnView prepareObject:gameScene shouldAbortBlock:NULL] перед установкой gameScene на scnView.scene.

Проблема в том, что в первый раз scnView отображает gameScene очень медленно (несколько секунд). Даже основной поток блокируется в течение этого периода, что означает, что пользовательский интерфейс не может обновляться, а иногда приложение убивает iOS. После второго рендеринга сцены это очень быстро, и основной поток работает хорошо. Но если мы удалим приложение и переустановите его, проблема возникает снова.

Любая помощь приветствуется.


person lusnaow    schedule 24.02.2016    source источник
comment
Какая часть медленная? Скачивание с вашего сервера (вы должны делать это в фоновой ветке)? Обработка после загрузки? Создание экземпляра сцены? Из вашего описания того, что вы пробовали, похоже, что вы передаете сжатые файлы SCN вместо файлов DAE (это было бы хорошо!). Почему вам нужно разместить их в Интернете, а не встраивать в свое приложение в качестве ресурсов?   -  person Hal Mueller    schedule 24.02.2016
comment
Сцена создана. Медленная часть - это первый раз, когда сцена появляется после создания экземпляра сцены. Неважно, SCN это или DAE, это одно и то же. Мы делаем это, потому что ресурсы должны обновляться в разное время.   -  person lusnaow    schedule 25.02.2016
comment
Вы находите решения? У меня такая же проблема, размер легкого материала и т. Д. Не имеет значения. В первый раз, когда я загружаю сцену, я загружаю узел из .scn и добавляю его в сцену в представлении сцены, кажется, что этот код происходит немедленно. Модель бота не отображается, а через несколько секунд отображается. Между addNode прошло много времени - ›показать узел в сцене   -  person Michał Ziobro    schedule 03.10.2020


Ответы (1)


Я думаю, что prepareObjects(_:withCompletionHandler) (определенный на SCNSceneRenderer) заслуживает внимания. Он загружает ресурсы в фоновый поток.

person Hal Mueller    schedule 25.02.2016
comment
Как я уже упоминал, я вызвал эту функцию, но она все еще медленная. - person lusnaow; 26.02.2016
comment
Да, я вызываю это в фоновом потоке. Эта проблема возникает только при первом рендеринге нового файла dae. Независимо от того, повторно выходим в сцену или повторно открываем приложение, оно исчезает. Но если мы удалим приложение и переустановим его, Проблема появляется снова. Я предполагаю, что SceneKit должен сделать что-нибудь вроде создания файла в песочнице при первом рендеринге модели? - person lusnaow; 26.02.2016