Я разрабатываю приложение ARKit вместе с Vision
/ AVKit
фреймворками.Мое приложение распознает жесты рук (жесты «Победа», «Окей», «Кулак») для управления видео.Поэтому я использую MLModel
для классификации своих жестов.
Приложение работает нормально, но содержимое представления отображается с 120 fps .Мне не нужна такая частота кадров.Это слишком много для моего приложения и это тяжелая нагрузка для процессора.Я попытался снизить частоту кадров до 30 кадров в секунду , используя свойство экземпляра SceneKit:
var preferredFramesPerSecond: Int { get set }
, но моя частота кадров остается той же - 120 кадров в секунду.
Вот как я это сделал:
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 ?