Поддержка устройств и отчеты сессии
Из-за различий в оборудовании и производительности устройств, функции AR часто не могут работать на всех устройствах. Поэтому точное определение поддержки устройств при использовании функций AR крайне важно. В этой статье объясняется, как выражается доступность устройств в Unity, и как получить информацию о поддержке устройств и доступности сессии через отчеты сессии (ARSession.Report).
Перед началом
- Ознакомьтесь с введением в ARSession, чтобы понять основные концепции, компоненты и рабочий процесс сессии
Поддержка устройств, доступность сессии и сборка
Каждая функция AR может поддерживаться разными устройствами. Например, отслеживание движения требует определенных аппаратных компонентов и обычно калибровки устройства, тогда как отслеживание изображений может работать практически на любом устройстве с доступной камерой. Поэтому, чтобы определить, может ли AR-приложение работать на конкретном устройстве, обычно необходимо знать, какие функции AR используются в данный момент, или, другими словами, определить, может ли конкретная сессия работать на устройстве.
В Unity этот процесс определения происходит на этапе сборки сессии (Assemble()). Процесс сборки определяет окончательное состояние сессии перед запуском, основываясь на включенных компонентах и поддержке текущего устройства.
Если сборка прошла успешно, сессия переходит в состояние Ready и может быть запущена и продолжать работу; если сборка не удалась, сессия переходит в состояние Broken, и конкретную причину сбоя можно узнать через отчет сессии (ARSession.Report).
Отчет сессии
Свойство ARSession.Report предоставляет отчет о работе сессии. Отчет сессии содержит следующие поля:
| Свойство | Описание |
|---|---|
| Availability | Полный отчет о доступности |
| BrokenReason | Причина повреждения сессии, действует, когда состояние сессии Broken |
| Exception | Конкретное исключение повреждения сессии, действует, когда состояние сессии Broken |
В отчете сессии можно проверить доступность каждого компонента через Availability или узнать подробную причину повреждения при сбое сессии через BrokenReason.
Пример отчета сессии
Например, в Windows, если сессия содержит ImageTrackerFrameFilter, CameraDeviceFrameSource и несколько других компонентов источника кадров, процесс сборки проверит доступность каждого компонента и сгенерирует следующий отчет:

Видно, что хотя Availability компонента ARCoreFrameSource имеет статус Unavailable, Availability для ImageTrackerFrameFilter и CameraDeviceFrameSource имеет статус Available, поэтому сборка сессии прошла успешно, и сессия успешно перешла в состояние Ready.
Если удалить CameraDeviceFrameSource из сессии, процесс сборки сгенерирует следующий отчет:

Видно, что количество элементов в списке FrameSources уменьшилось с 9 до 8, и хотя Availability компонента ImageTrackerFrameFilter по-прежнему имеет статус Available, из-за отсутствия доступных компонентов источника кадров сборка сессии не удалась, и сессия перешла в состояние Broken. В этом случае значение поля BrokenReason в отчете - NoAvailabileFrameSource, что означает отсутствие доступных источников кадров.
Помимо процесса сборки, сессия может быть повреждена во время работы, например, если работающий компонент был случайно удален. В этом случае также можно узнать конкретную причину повреждения через отчет сессии.
Обновление отчета
Отчет сессии изменяется в следующие моменты:
Завершение первого этапа сборки
В этот момент генерируется полный отчет сессии, включая отчет о доступности компонентов. Часть Availability отчета сессии фиксируется и больше не изменяется.
Обновление отчета о доступности компонентов можно получить через событие AssembleUpdate.
Если сессия запускается сразу после сборки, обновление отчета сессии также можно получить через событие StateChanged. Следует обращать внимание на состояния сессии: Ready и Broken.Завершение второго этапа сборки
В этот момент генерируется новый отчет о доступности компонентов. Отчет сессии не обновляется, если сессия не перезапускается.
Обновление отчета о доступности компонентов можно получить через событие AssembleUpdate.Повреждение сессии при запуске или во время работы
Поля BrokenReason и Exception отчета сессии обновляются.
Обновление отчета сессии можно получить через событие StateChanged. Следует обращать внимание на состояние сессии: Broken.
Содержание отчета: причины повреждения сессии
BrokenReason указывает причину повреждения сессии. Возможны следующие ситуации:
| Причина | Описание |
|---|---|
| Uninitialized | Процесс сборки, EasyAR Sense не инициализирован успешно |
| LicenseInvalid | Процесс сборки, проверка лицензии EasyAR Sense не удалась или лицензия не применима для текущего использования |
| SessionObjectIncomplete | Процесс сборки, объект сессии неполный. Например, в URP неправильно настроен RendererFeature |
| NoAvailabileFrameSource | Процесс сборки, нет доступных источников кадров. Например, все источники кадров недоступны или не добавлены. Только в конфигурации сессии по умолчанию это указывает на отсутствие поддержки выбранных функций AR на устройстве |
| FrameSourceIncomplete | Процесс сборки, источник кадров неполный. Обычно возникает при неправильной реализации интерфейса источника кадров в пользовательских источниках |
| FrameFilterNotAvailabile | Процесс сборки, присутствует недоступный фильтр кадров. Возникает только при определенных опциях сборки. |
| StartFailed | Ошибка запуска. Например, возникло исключение во время запуска |
| RunningFailed | Ошибка во время работы. Например, работающий компонент был случайно удален, или в URP неправильно настроен RendererFeature и т.д. |
Содержание отчета: информация о доступности
Availability предоставляет информацию о доступности каждого компонента в сессии. Он содержит следующие поля:
| Поле | Описание |
|---|---|
| FrameFilters | Список доступности фильтров кадров, проверенных в процессе сборки |
| FrameSources | Список доступности источников кадров, проверенных в процессе сборки |
| PendingDeviceList | Задачи загрузки списка устройств, которые еще не завершены |
| DeviceList | Результат загрузки списка устройств |
Поля PendingDeviceList и DeviceList используются для отображения статуса загрузки списка поддерживаемых устройств. При завершении первого этапа сборки, сборка переходит во второй этап только тогда, когда PendingDeviceList не пуст. Это условие можно использовать для определения, будет ли событие AssembleUpdate вызвано во второй раз.
Следующие шаги
- Попробуйте определить доступность и поддержку устройств