Добавление узла ARKit вызывает падение кадра даже после использования `prepare` - PullRequest
0 голосов
/ 11 июня 2018

Я добавляю 3D model, содержащий анимации, к сцене, которую я ранее загружал из Интернета.Перед добавлением этой node я использую prepare функцию, потому что я не хочу избегать падения кадра.Но все же я получаю очень короткое падение кадра до 47 кадров в секунду.Это вызвано выполнением этой prepare функции.Я также пытался использовать prepare(_:, shouldAbortBlock:) в другой очереди отправки, но это все равно не помогло.Может кто-нибудь помочь мне решить эту проблему или сказать, почему это происходит?

arView.sceneView.prepare([mediaNode]) { [mediaNode, weak self] (success) in
    guard let `self` = self else { return }
    guard
        let currentMediaNode = self.mediaNode as? SCNNode,
        currentMediaNode === mediaNode,
        !self.mainNode.childNodes.contains(mediaNode)
        else { return }
    self.mainNode.addChildNode(mediaNode)
}

Кстати, это список файлов, которые я использую для загрузки этой модели:

https://www.dropbox.com/s/7968fe5wfdcxbyu/Serah-iOS.dae?dl=1
https://www.dropbox.com/s/zqb6b6rxynnvc5e/0001.png?dl=1
https://www.dropbox.com/s/hy9y8qyazkcnvef/0002.tga?dl=1
https://www.dropbox.com/s/fll9jbjud7zjlsq/0004.tga?dl=1
https://www.dropbox.com/s/4niq12mezlvi5oz/0005.png?dl=1
https://www.dropbox.com/s/wikqgd46643327i/0007.png?dl=1
https://www.dropbox.com/s/fioj9bqt90vq70c/0008.tga?dl=1
https://www.dropbox.com/s/4a5jtmccyx413j7/0010.png?dl=1

Файл DAE уже скомпилирован инструментами XCode, так что его можно загрузить после загрузки из Интернета.И вот код, который я использую для загрузки после загрузки:

class func loadModel(fromURL url: URL) -> SCNNode? {
    let options = [SCNSceneSource.LoadingOption.animationImportPolicy : SCNSceneSource.AnimationImportPolicy.playRepeatedly]
    let sceneSource = SCNSceneSource(url: url, options: options)
    let node = sceneSource?.entryWithIdentifier("MDL_Obj", withClass: SCNNode.self)
    return node
}

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

У меня возникла та же проблема.Все мои узлы пользовались преимуществами физического рендеринга (PBR), и когда я впервые добавил узел в сцену, частота кадров значительно снизилась, но после этого все было в порядке.Я мог бы добавить столько же узлов без падения частоты кадров.

Я нашел способ обойти эту проблему.То, что я делаю, это после того, как я создаю свою конфигурацию ARConfiguration и перед вызовом session.run (конфигурация), я добавляю в сцену тестовый узел с PBR.Чтобы этот узел не появлялся, я установил colorBufferWriteMask материала узла в пустой массив (см. Ответ: ARKit скрыть объекты за стенами ) Затем, прежде чем добавить свое содержимое, я удаляю этот узел.Добавление и удаление этого тестового узла помогает мне.

Вот пример:

var pbrTestNode: SCNNode!

func addPBRTestNode() {
        let testGeometrie = SCNBox(width: 0.5, height: 0.5, length: 0.5, chamferRadius: 0)
        testGeometrie.materials.first?.diffuse.contents = UIColor.blue
        testGeometrie.materials.first?.colorBufferWriteMask = []
        testGeometrie.materials.first?.lightingModel = .physicallyBased
        pbrTestNode = SCNNode(geometry: testGeometrie)

        scene.rootNode.addChildNode(pbrTestNode)
    }

func removePBRTestNode() {
        pbrTestNode.removeFromParentNode()
    }

func startSessionWithPlaneDetection() {
        // Create a session configuration
        let configuration = ARWorldTrackingConfiguration()
        if #available(iOS 11.3, *) {
            configuration.planeDetection = [.horizontal, .vertical]
        } else {
            configuration.planeDetection = .horizontal
        }
        configuration.isLightEstimationEnabled = true

        // this prevents the delay when adding any nodes with PBR later
        sceneController.addPBRTestNode()

        // Run the view's session
        sceneView.session.run(configuration)
    }

Вызовите removePBRTestNode (), когда вы добавляете свой контент на сцену.

0 голосов
/ 11 июня 2018

Самый простой способ избавиться от опускающейся рамки в ARKit / SceneKit / AVKit - это использовать металлический каркас.Представьте себе: простой фильтр изображения может работать в GPU более чем в сто раз быстрее, чем эквивалентный фильтр на базе процессора.То же самое я могу сказать о AV-видео и 3D-анимации в реальном времени - они работают намного лучше на GPU.

Например, вы можете прочитать этот полезный пост об использовании рендеринга металла для AVCaptureSession.Существует потрясающий рабочий процесс, как использовать Metal.

PS Проверьте свой анимированный объект / сцену в инструменте 3D-авторинга (если он в порядке) перед написанием кода.

...