Экспорт ARSCNFaceGeometry, завернутый в MDLAsset, завершается с ошибкой в iOS 14 с помощью EXC_BAD_ACCESS

#ios #swift #arkit

#iOS #swift #arkit

Вопрос:

У меня есть приложение, которое использует функцию отслеживания лиц ARKit для создания файлов модели лица .obj. Обычно он соответствует практике отслеживания и визуализации граней. Приложение получает привязку func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) и обновляет геометрию func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) .

Для экспорта модели лица используется следующая функция, которая переносит объект ARSCNFaceGeometry в a MDLAsset и экспортирует его. Код выглядит следующим образом.

 func exportMesh(_ geometry: SCNGeometry, to url: URL, completion: (() -> ())?) {
    DispatchQueue.global().async {
        let mesh = MDLMesh(scnGeometry: geometry)
        let asset = MDLAsset()
        asset.add(mesh)
        do {
            try asset.export(to: url)
        } catch {
            print("Can't write mesh to url")
        }
        DispatchQueue.main.async {
            completion?()
        }
    }
}
  

Приложение отлично работало раньше на iOS 13. Однако, когда я установил его на iOS 14, приложение вылетает в строке try asset.export . Синтаксис do-catch не перехватил ошибку, он напрямую вылетает с EXC_BAD_ACCESS. Я попытался экспортировать только a SCNBox на этом шаге, и он работал нормально, кажется, это как-то связано с ARSCNFaceGeometry .

Мой Mac и тестовое устройство обновлены до новейшей системы, тестовое устройство — iPhone X.

Снимок экрана может быть полезен.

скриншот

Я был бы очень признателен, если бы вы могли дать какой-нибудь намек.

Комментарии:

1. Можете ли вы распечатать asset , url , и mesh убедиться, что они не равны нулю? Можете ли вы сделать снимок экрана с полной трассировкой стека при достижении исключения в отладчике?

2. @jtbandes Спасибо. Я только что проверил это asset url и mesh не является нулевым, снимок экрана добавлен к проблеме. Но я не думаю, что в отпечатках отладчика есть что-то полезное.

Ответ №1:

Возможно, я немного опоздал, но я столкнулся с аналогичным сбоем при экспорте SCNGeometry. Последний фрейм стека вызовов ‘_platform_strlen’ привел меня к чему-то, связанному со строками. Итак, в моем случае я просто присвоил имя каждому материалу, на который ссылается экземпляр SCNGeometry.