Table of Contents

Поддержка устройств и session report

Из-за различий в аппаратной части и производительности устройств AR-функции часто не могут работать на всех устройствах. Поэтому при использовании AR-функций очень важно точно определить поддержку текущего устройства. В этой статье описано, как в Unity выражается доступность устройства и как получить информацию о поддержке устройств и доступности session через session report (ARSession.Report).

Перед началом

Поддержка устройств, доступность session и assembly

Устройства, поддерживаемые каждой AR-функцией, различаются. Например, motion tracking предъявляет определённые требования к аппаратным компонентам и обычно требует калибровки устройства, тогда как image tracking может работать почти на всех устройствах с доступной камерой. Поэтому, чтобы определить, может ли AR-приложение работать на определённом устройстве, обычно нужно знать, какие AR-функции используются в данный момент, или, иначе говоря, определить, может ли session работать на устройстве.

В Unity этот процесс выполняется на этапе session assembly (Assemble()). Процесс assembly определяет итоговое состояние перед запуском session на основе компонентов, содержащихся в session, и поддержки текущего устройства.

Если assembly успешна, session переходит в состояние Ready и может быть запущена и продолжить работу. Если assembly завершается неудачно, session переходит в состояние Broken, а конкретную причину сбоя можно запросить через session report (ARSession.Report).

Session report

Свойство ARSession.Report предоставляет runtime-отчёт session. Session report содержит следующие поля:

Свойство Описание
Availability Полный отчёт о доступности
BrokenReason Причина повреждения session, действительно когда состояние session равно Broken
Exception Конкретное исключение повреждения session, действительно когда состояние session равно Broken

В session report можно использовать Availability для запроса доступности каждого компонента или BrokenReason для запроса подробной причины повреждения, когда session повреждена.

Пример session report

Например, в Windows, если session содержит ImageTrackerFrameFilter, CameraDeviceFrameSource и несколько других компонентов frame source, процесс assembly проверит доступность каждого компонента и создаст следующий отчёт:

alt text

Видно, что хотя Availability компонента ARCoreFrameSource имеет значение Unavailable, поскольку Availability у ImageTrackerFrameFilter и CameraDeviceFrameSource оба равны Available, assembly всей session успешна, и session успешно переходит в состояние Ready.

Если удалить CameraDeviceFrameSource из session, процесс assembly создаст следующий отчёт:

alt text

Видно, что количество элементов в списке FrameSources изменилось с 9 на 8. Хотя Availability компонента ImageTrackerFrameFilter всё ещё равно Available, из-за отсутствия доступного компонента frame source assembly всей session завершается неудачно, и session переходит в состояние Broken. В этот момент значение поля BrokenReason в отчёте равно NoAvailabileFrameSource, что означает отсутствие доступного frame source.

Помимо процесса assembly, session может быть повреждена и во время выполнения, например если работающий компонент был случайно удалён. В этом случае конкретную причину повреждения также можно запросить через session report.

Обновление отчёта

Session report изменяется в следующие моменты:

  • Завершение первого этапа assembly
    В этот момент создаётся полный session report, включая отчёт о доступности компонентов. Часть Availability session report определяется в этот момент и больше не изменяется. Обновление отчёта о доступности компонентов можно получить через событие AssembleUpdate.
    Если session запускается сразу после assembly, обновление session report также можно получить через событие StateChanged. Состояния session, на которые нужно обратить внимание: Ready и Broken.

  • Завершение второго этапа assembly В этот момент создаётся новый отчёт о доступности компонентов. Если session не перезапущена, session report больше не обновляется. Обновление отчёта о доступности компонентов можно получить через событие AssembleUpdate.

  • При запуске session или повреждении session во время выполнения
    BrokenReason и Exception в session report обновляются. Обновление session report можно получить через событие StateChanged. Состояния session, на которые нужно обратить внимание: Broken.

Содержание отчёта: причины повреждения session

BrokenReason означает причину повреждения session. Возможны следующие ситуации:

Причина Описание
Uninitialized Процесс assembly: EasyAR Sense не был успешно инициализирован
LicenseInvalid Процесс assembly: проверка license EasyAR Sense завершилась неудачно или license неприменима к текущему использованию
SessionObjectIncomplete Процесс assembly: object session неполный. Например, RendererFeature неправильно настроен в URP
NoAvailabileFrameSource Процесс assembly: нет доступного frame source. Например, все frame source недоступны или ни один frame source не добавлен. Только при конфигурации session по умолчанию эта ситуация означает поддержку устройством выбранной текущей AR-функции
FrameSourceIncomplete Процесс assembly: frame source неполный. Обычно возникает, когда custom frame source неправильно реализует interface frame source
FrameFilterNotAvailabile Процесс assembly: существует недоступный frame filter. Эта ситуация существует только при некоторых assembly options.
StartFailed Запуск не удался. Например, во время запуска возникло exception
RunningFailed Runtime failed. Например, работающий компонент был случайно удалён или RendererFeature неправильно настроен в URP.

Содержание отчёта: информация о доступности

Availability предоставляет информацию о доступности каждого компонента в session. Он содержит следующие поля:

Поле Описание
FrameFilters Список доступности frame filter, проверенных во время assembly
FrameSources Список доступности frame source, проверенных во время assembly
PendingDeviceList Незавершённая задача загрузки списка устройств
DeviceList Результат загрузки списка устройств

Поля PendingDeviceList и DeviceList используются для отображения состояния загрузки списка поддержки устройств. Когда первый этап assembly завершён, тогда и только тогда, когда PendingDeviceList не пуст, assembly переходит на второй этап. Это условие можно использовать, чтобы определить, будет ли AssembleUpdate выполнено во второй раз.

Следующие шаги