Как запустить два отдельных опыта ARKit в одном iOS приложении - PullRequest
1 голос
/ 07 января 2020

У меня проблема с запуском двух ARKit опытов в одном приложении. У меня есть главное меню View Controller, которое запускает любой из событий. Это выглядит примерно так:

  • MainVC - основной UIViewController с двумя кнопками для выбора опыта
  • ARVC1 - первый опыт UIViewController
  • ARVC2 - второй опыт UIViewController

Оба опыта независимы, и им не нужно передавать какие-либо данные между собой. К сожалению, когда я отклоняю ARVC1 или ARVC2 и запускаю второй, у меня почему-то остаются следы предыдущего ARSession (кадр из предыдущего сеанса мигает некоторое время). Можно ли как-то сбросить полностью ARSession? Кажется, что он остается где-то на заднем плане. Я пытался приостановить сеанс, когда я закрывал какой-либо из контроллеров представления, но это не помогло.

То же самое происходит, если я открываю ARVC1 и нажимаю кнопку для отображения статистики:

arView.debugOptions = [.showStatistics]

После отклонения ARVC1 и повторного открытия он все равно показывает статистику, поэтому он работает где-то в фоновом режиме.

1 Ответ

1 голос
/ 09 января 2020

Я нашел решение своей проблемы:

После открытия и закрытия ARVC1 и быстрого открытия ARVC2 я испытал мерцание предыдущего ARSession в текущем ARSession. Чтобы решить эту проблему, я создаю ARView в своем MainVC и передаю ссылку на него контроллеру назначения, где я устанавливаю ограничения arView программно. Чтобы избежать передачи ARAnchors, я сбрасываю конфигурацию с параметрами в viewDidLoad:

arView.session.run(configuration, options: [.resetTracking,.removeExistingAnchors,.stopTrackedRaycasts])

Это также помогло с переходом UINavigationController (сделал его более плавным), потому что ARSession настроен до того, как представление будет представлен и устраняет черный флаг sh, возникающий в тот момент, когда вы запускаете новый ARConfiguration с ARSession.

. Он также устраняет ошибку консоли (ниже), с которой я столкнулся при быстром закрытии и открытие ViewController, содержащее ARView, которое иногда вызывало сбой приложения:

[Сеанс] Сеанс (0x160879b40): произошел сбой с ошибкой: Ошибка Domain = com.apple.arkit.error Code = 102 «Обязательный датчик неисправен». UserInfo = {NSLocalizedFailureReason = Датчик не смог доставить требуемый ввод., NSUnderlyingError = 0x283f959b0 {Ошибка домена = AVFoundationErrorDomain Code = -11800 "Операция не может быть завершена" UserInfo = {NSLocalizedFailureReason = Произошла неизвестная ошибка (-12780D) = Операция не может быть завершена, NSUnderlyingError = 0x283efc8a0 {Error Domain = NSOSStatusErrorDomain Code = -12780 "(null)"}}}, NSLocalizedRecoverySuggestion = Убедитесь, что приложение имеет необходимые параметры конфиденциальности., NSLocalizedDescription = Обязательный датчик не выполнен.} 2020-01-09 16: 20: 38.600835 + 0000 Приложение [573: 231750] [Техника] На эффективность отслеживания в мире влияют ограничения ресурсов [3] 2020-01-09 16: 20: 38.600977 + 0000 Приложение [573: 231750 ] [Техника] Обратный вызов ошибки VIO: 8506.590769, 3, временные метки кадра либо вышли из строя, либо повторяются

...