ARKit - sceneView отображает свой контент со скоростью 120 кадров в секунду (но мне нужно 30 кадров в секунду) - PullRequest
0 голосов
/ 01 декабря 2018

Я разрабатываю приложение ARKit вместе с Vision / AVKit фреймворками.Мое приложение распознает жесты рук (жесты «Победа», «Окей», «Кулак») для управления видео.Поэтому я использую MLModel для классификации своих жестов.

Приложение работает нормально, но содержимое представления отображается с 120 fps .Мне не нужна такая частота кадров.Это слишком много для моего приложения и это тяжелая нагрузка для процессора.Я попытался снизить частоту кадров до 30 кадров в секунду , используя свойство экземпляра SceneKit:

var preferredFramesPerSecond: Int { get set }

, но моя частота кадров остается той же - 120 кадров в секунду.

enter image description here

Вот как я это сделал:

import UIKit
import AVKit
import SceneKit
import ARKit
import Vision

class ViewController: UIViewController, ARSCNViewDelegate {

    @IBOutlet var sceneView: ARSCNView! 
    var avPlayerView = AVPlayerViewController()
    private let player = AVQueuePlayer()
    let clips = ["AA", "BB", "CC"]
    private var token: NSKeyValueObservation?
    var number: Int = 0
    var once: Bool = true    
    let dispatchQueueML = DispatchQueue(label: "net.aaa.iii") 
    var visionRequests = [VNRequest]()

    override func viewDidLoad() {
        super.viewDidLoad()
        sceneView.delegate = self
        sceneView.showsStatistics = true
        sceneView.preferredFramesPerSecond = 30     // HERE IT GOES
        sceneView.rendersContinuously = true

        let scene = SCNScene()
        sceneView.scene = scene
        sceneView.scene.background.contents = UIColor.black.withAlphaComponent(0)

        guard let selectedModel = try? VNCoreMLModel(for: handsModel().model) else {
            fatalError("Couldn't load a model.")
        }

        let classificationRequest = VNCoreMLRequest(model: selectedModel, 
                                        completionHandler: classificationCompleteHandler)
        classificationRequest.imageCropAndScaleOption = VNImageCropAndScaleOption.centerCrop
        visionRequests = [classificationRequest]       
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        self.addAllVideosToPlayer()
        present(avPlayerView, animated: true,
                            completion: { self.player.play() })

        let configuration = ARWorldTrackingConfiguration()
        configuration.isAutoFocusEnabled = false
        sceneView.session.run(configuration)
    }

    func addAllVideosToPlayer() {
        avPlayerView.player = player
        // .........................
    }
    func toggleNextVideo() {
        // ..............
    }
    func togglePreviousVideo() {
        // ..............
    }

    // ..............................
    // ..............................

    DispatchQueue.main.async {
        if (topPredictionScore != nil && topPredictionScore! > 0.01) {  
            if (topPredictionName == "FistGesture") && (self.once == false) {
                self.once = true
            }
            if (topPredictionName == "OkeyGesture") && (self.once == true) {
                self.toggleNextVideo()
                self.once = false
            }
        }
    }
}

Вот что Apple говорит об этом :

SceneKit выбирает фактическую частоту кадров, максимально приближенную к вашей предпочтительной частоте кадров, в зависимости от возможностей экрана, на котором отображается вид.Фактическая частота кадров обычно является фактором максимальной частоты обновления экрана, чтобы обеспечить постоянную частоту кадров.

Например, если максимальная частота обновления экрана составляет 60 кадров в секунду, это также самая высокая частота кадров, которую вид устанавливает в качестве фактической частоты кадров.Однако, если вы запрашиваете более низкую частоту кадров, SceneKit может выбрать 30, 20, 15 или какой-либо другой фактор в качестве фактической частоты кадров.По этой причине вы хотите выбрать частоту кадров, которую ваше приложение может постоянно поддерживать.Значение по умолчанию: 60 fps.

Как снизить частоту кадров просмотра до 30 fps ?

1 Ответ

0 голосов
/ 02 декабря 2018

Я решил проблему.SceneKit не позволяет изменять частоту кадров в данный момент - она ​​имеет фиксированную 120 к / с .Поэтому вместо этого я использовал SpriteKit framework - он позволяет мне использовать 30 кадров в секунду .

enter image description here

Вот изменения в моем коде:

import SpriteKit

class ViewController: UIViewController, ARSKViewDelegate {

    @IBOutlet weak var sceneView: ARSKView!
    // ....................

    override func viewDidLoad() {
        super.viewDidLoad()
        sceneView.delegate = self
        sceneView.preferredFramesPerSecond = 30     // NOW IT WORKS 

        let scene = SKScene()
        sceneView.presentScene(scene)
    }
    // ..................
}
...