ARKit: приостановка сеанса не останавливает вызов сцены

Я использую ARKit с SpriteKit. Моя функция AR не является основной функцией в моем приложении, пользователи могут при желании перейти к viewController с ARSKView, где я настраиваю и устанавливаю SKScene в ARsession.

Я приостанавливаю сеанс, когда пользователь возвращается назад:

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)   
    sceneView.session.pause()
}

тогда viewController появляется из navigationController, куда он был помещен. Но я вижу, что функция func update(_ currentTime: TimeInterval) в моем SKScene подклассе продолжает вызываться ... что является подходящим способом остановить это? Я думал, что приостановка ARSession также остановит сцену.

РЕДАКТИРОВАТЬ: когда я возвращаюсь из контроллера представления, который содержит ARSKView, и он деинициализирован, я вижу, что SKScene все еще находится в памяти, а новый создается каждый раз, когда я снова перехожу к AR, относящемуся к просмотр контроллера. Итак, если я перейду туда N раз, я вижу, что у меня в памяти N SKScene. Как я мог надлежащим образом удалить сцену при переходе назад? Свойство scene ARsession доступно только для чтения.


person AppsDev    schedule 11.10.2017    source источник
comment
приостановить просмотр, sceneView.isPaused = true, или приостановить сцену, sceneView.scene.isPaused = true в зависимости от того, что вам нужно   -  person Knight0fDragon    schedule 11.10.2017
comment
@ Knight0fDragon, спасибо. Однако, поскольку мое приложение ориентировано не на ARKit, а на дополнительную функцию, пользователь может вернуться назад из контроллера представления, содержащего ARSKView. Я заметил, что приостановки SKScene недостаточно, он все еще живет после деиницирования контроллера представления, как мне уничтожить сцену?   -  person AppsDev    schedule 30.10.2017
comment
@AppsDev вы нашли решение?   -  person Crashalot    schedule 06.04.2018
comment
@ Knight0fDragon, похоже, isPaused для SCNView нет, только pause()   -  person Crashalot    schedule 06.04.2018
comment
@Crashalot это про SKView   -  person Knight0fDragon    schedule 06.04.2018
comment
@ Knight0fDragon ты прав! извинения. :)   -  person Crashalot    schedule 06.04.2018
comment
@AppsDev вы нашли какое-нибудь решение?   -  person Jagveer Singh Rajput    schedule 02.07.2018
comment
Я имею в виду, кто когда-либо захочет должным образом остановить ARSession, однажды начав, эй. Точно никто;) -Да, это довольно серьезная оплошность со стороны Apple. @AppsDev Вы в этом разобрались?   -  person Geoff H    schedule 10.10.2018


Ответы (2)


это звучит как проблема с сохранением памяти. Убедитесь, что любой узел в вашем подклассе SKScene правильно удален и деинициализирован. Установите для делегата сцены значение nil, установите для любого узла или массива узлов, на которые имеется ссылка в вашем VC, значение nil.

Я провел простой тест с двумя VC, встроенными в контроллер навигации, первый имеет вид с кнопкой запуска, второй - ARVC. Я запускаю сеанс, устанавливаю своего делегата пользовательской сцены на ARVC, когда я нажимаю кнопку «Назад», все останавливается само по себе и появляется мой ARVC. Ничего в памяти.

Поэтому убедитесь, что вы вручную удалили все свои узлы и их анимации, ограничения, действия и все, что связано с вашим настраиваемым подклассом SKScene. Также не бойтесь вызывать sceneView.presentScene (nil), если это может помочь.

person Adrien Yvon    schedule 17.09.2019

Я не смог найти никакой официальной документации по этому поводу, по-видимому, пока нет подходящего способа остановить сеанс. Я обнаружил, что похожий на ваш сценарий это обходной путь < / а>.

Он предлагает вам создать ARSKView как одноразовый и, прежде чем покинуть контроллер, приостановить сеанс, удалить представление из супервизора и присвоить ему значение nil.

person Marina Aguilar    schedule 17.09.2019
comment
Добро пожаловать в Stack Overflow! Хотя теоретически это может дать ответ на вопрос, было бы предпочтительнее включить сюда основные части ответа и предоставить ссылку для справки. . - person Anton Menshov; 17.09.2019