Падение FPS при добавлении ребенка в сцену ARKit/SceneKit

Я работаю над проектом ARKit уже 4 месяца. Я заметил, что при добавлении дочернего элемента к моему корню rootNode происходит падение FPS. Устройство замерзает менее чем за секунду. Я провел много исследований и испытаний, заметил, что во всех примерах кода Apple это падение FPS также при размещении объекта. Не имеет значения, добавлен ли узел напрямую (scene.rootNode.addChild(child)) или добавлен в цикл визуализации на разных этапах (didUpdateAtTime, didApplyAnimations и т.д.). Я обнаружил, что как только объект был добавлен в сцену, следующий добавленный объект будет отображаться немедленно. Я использую 3D-модель, созданную в редакторе SceneKit, клон, чтобы сгенерировать мои разные узлы, прежде чем добавлять их как дочерние. Я выполняю эту загрузку перед размещением объектов.

Инструменты показывают, что цикл визуализации занят на время замораживания.

Единственное решение, которое я нашел, это добавить мои узлы в сцену за экраном загрузки, прежде чем начать весь опыт.

Это нормальное поведение в игровом программировании для рендеринга узлов перед их использованием?

Спасибо, парни

Ответ 1

С выпуском ARKit 3.0 и его спутника - RealityKit (среда с оптимизированным механизмом рендеринга и измененной иерархией сцен, написанная на Swift, следовательно, не имеет привязки Objective-C), drop-frame, при добавлении потомка, уменьшается до незаметного значения.

И такое предсказуемое поведение связки ARKit3/RealityKit особенно актуально для устройств с процессорами A12 Bionic и A13 Bionic, изготовленными по 7 нм процессу (и, конечно, из-за к тому, что у них есть нейронные движки последнего поколения и мощные графические процессоры).

Для устройств с менее мощными процессорами (A9, A10, A11) рекомендуется использовать 3D-модели с общим количеством полигонов не более 10K на модель и с обычными шейдерами, такими как .blinn или .phong (не PBR).

Я считаю, что это довольно распространенная практика для игр и приложений, использующих игровые движки, сначала загружать (или кэшировать) все необходимые игровые ресурсы (например, 3D-модели, текстуры, звуковые файлы и т.д.) В ОЗУ перед их использованием. Подробнее читайте в этой статье и этой статье.

Однако стоит сказать, что AR-игры, в отличие от VR-игр, потребляют значительно больше вычислительной мощности, поэтому их необходимо тщательно оптимизировать. Итак, вы абсолютно правы, визуализируя узлы перед их использованием, и это нормальное поведение в игровом программировании.