Этапы ARKit и RealityKit
При запуске приложения AR в ARKit и RealityKit есть три этапа:
- Отслеживание
- Понимание сцены
- Рендеринг
Каждый этап может значительно увеличить время, необходимое для размещения модели (+1 ... + 4 секунды, в зависимости от устройства). Давайте поговорим о каждом этапе.
Отслеживание
Это начальное состояние для вашего приложения AR. Здесь iPhone смешивает визуальные данные, поступающие через заднюю камеру RGB со скоростью 60 кадров в секунду, и преобразует данные, поступающие от датчиков IMU (акселерометр, гироскоп и компас) со скоростью 1000 кадров в секунду. Автоматически генерируемые Feature Points помогают ARKit и RealityKit отслеживать окружающую среду и строить карту отслеживания (будь то World Tracking или, например, Face Tracking). Feature Points спонтанно генерируются на жестких границах реальных объектов и текстур в хорошо освещенной среде. Если у вас уже есть ранее сохраненная карта мира, это сокращает время размещения модели в сцене. Также вы можете использовать ARCoachingOverlayView
для полезных визуальных инструкций, которые помогут вам во время инициализации и восстановления сеанса.
Понимание сцены
Второй этап может включать в себя обнаружение горизонтальной и вертикальной плоскости, Ray-Casting ( или Hit-Testing) и легкой оценки. Если вы активировали функцию обнаружения плоскости, потребуется некоторое время, чтобы обнаружить самолет с соответствующим ARPlaneAnchor (или AnchorEntity(.plane)
), который должен привязать виртуальную модель - в вашем случае куб. Также есть Расширенное понимание сцены , позволяющее использовать функцию Реконструкция сцены . Вы можете использовать реконструкцию сцены в гаджетах с помощью сканера LiDAR, и это дает вам улучшенный канал глубины для составления элементов в сцене и People Occlusion. Вы всегда можете включить функцию обнаружения изображения / объекта, но вы должны учитывать, что она построена на алгоритмах машинного обучения, которые увеличивают время размещения модели в сцене.
Рендеринг
Последний этап выполняется для рендеринга виртуальной геометрии в вашей сцене. Сцены могут содержать модели с шейдерами и текстурами на них, трансформацию или анимацию ресурсов, динамику и звук. Окружающие HDR-отражения для шейдеров Metalli c рассчитываются нейронными модулями. ARKit не может визуализировать сцену AR. Для 3D-рендеринга необходимо использовать такие фреймворки, как RealityKit, SceneKit или Metal. У этих фреймворков есть свои собственные механизмы рендеринга.
По умолчанию в RealityKit есть высококачественные эффекты рендеринга, такие как «Размытие в движении» или тени с трассировкой лучей, которые требуют дополнительных вычислительных мощностей. Примите это во внимание .
Подсказка
Чтобы значительно сократить время размещения объекта в сцене AR, используйте сканер LiDAR, который работает со скоростью наносекунды. Если в вашем гаджете нет LiDAR, то отслеживайте только окружающую среду, где условия освещения хорошие, все объекты реального мира четко различимы, а текстуры на них богаты и не имеют повторяющихся узоров. Кроме того, старайтесь не использовать в полигональной геометрии вашего проекта с более чем 10K + полигонами и текстурами высокого разрешения (jpeg
или png
с размером 1024x1024 считается нормальным).
Кроме того, в RealityKit 1.0 по умолчанию включено несколько heavy
параметров - Depth channel Compositing
, Motion Blur
и Ray-traced Contact Shadows
(на A11 и более ранних версиях есть проецируемые тени). Если вам не нужны все эти функции, просто отключите их. После этого ваше приложение будет намного быстрее.
Практическое решение I
(тени, размытие в движении, компенсация глубины и т. Д. c отключены)
Используйте следующие свойства для отключения эффектов, интенсивно использующих процессор:
override func viewDidLoad() {
super.viewDidLoad()
arView.renderOptions = [.disableDepthOfField,
.disableHDR,
.disableMotionBlur,
.disableFaceOcclusions,
.disablePersonOcclusion,
.disableGroundingShadows]
let boxAnchor = try! Experience.loadBox()
arView.scene.anchors.append(boxAnchor)
}
Практическое решение II
(тени, размытость при движении, глубина comp, et c. включены по умолчанию)
При использовании следующего кода в RealityKit:
override func viewDidLoad() {
super.viewDidLoad()
let boxAnchor = try! Experience.loadBox()
arView.scene.anchors.append(boxAnchor)
}
вы получаете предварительно сконфигурированную сцену Reality Composer, содержащую свойство обнаружения горизонтальной плоскости, и AnchorEntity
со следующими настройками:
AnchorEntity(.plane(.horizontal,
classification: .any,
minimumBounds: [0.25, 0.25])
Проблема, с которой вы столкнулись, заключается в задержке во времени, которая возникает в в момент запуска вашего приложения. В этот же момент запускается отслеживание мира (первый этап), затем приложение пытается одновременно определить горизонтальную плоскость (второй этап), а затем визуализирует металлический c шейдер куба (третий этап). Чтобы избавиться от этого запаздывания, используйте очень простой подход (при запуске приложения вам нужно отслеживать комнату, а затем нажимать на экран):
override func viewDidLoad() {
super.viewDidLoad()
let tap = UITapGestureRecognizer(target: self,
action: #selector(self.tapped))
arView.addGestureRecognizer(tap)
}
@objc func tapped(_ sender: UITapGestureRecognizer) {
let boxAnchor = try! Experience.loadBox()
arView.scene.anchors.append(boxAnchor)
}
Таким образом вы уменьшаете одновременную нагрузку на ЦП и GPU. Таким образом, ваш куб загружается быстрее.
PS
Кроме того, в качестве альтернативы вы можете использовать метод типа loadModelAsync(named:in:)
, который позволяет асинхронно загружать объект модели из файла в пакете:
static func loadModelAsync(named name: String,
in bundle: Bundle?) -> LoadRequest<ModelEntity>