首页 > 解决方案 > 在指定时间段内运行和暂停 ARSession

问题描述

我正在开发带有手势识别的ARKit/ VisioniOS 应用程序。我的应用程序有一个简单的 UI,其中包含单个UIView. 根本没有ARSCNView/ ARSKView。我将一系列捕获的内容ARFrames放入CVPixelBuffer然后用于VNRecognizedObjectObservation.

我不需要会话中的任何跟踪数据。我只currentFrame.capturedImage需要CVPixelBuffer. 而且我需要以 30 fps 的速度捕获 ARFrame。60 fps 是过高的帧速率。

preferredFramesPerSecond在我的情况下,实例属性绝对没用,因为它控制渲染ARSCNView/的帧速率ARSKView。我没有 ARViews。而且它不会影响会话的帧速率。

因此,我决定使用run()pause()方法来降低会话的帧速率。

问题

我想知道如何在指定的时间段内自动run和一个ARSession?和方法pause的持续时间必须是(或 0.016 秒)。我想可能通过. 但我不知道如何实现它。runpause16 msDispatchQueue

怎么做?

在此处输入图像描述

这是一个伪代码:

session.run(configuration)

    /*  run lasts 16 ms  */

session.pause()

    /*  pause lasts 16 ms  */

session.run(session.configuration!)

    /*  etc...  */

PS我的应用程序中既不能使用 CocoaPod 也不能使用 Carthage

更新:关于如何currentFrame.capturedImage检索和使用 ARSession。

let session = ARSession()

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    session.delegate = self
    let configuration = ARImageTrackingConfiguration() // 6DOF
    configuration.providesAudioData = false
    configuration.isAutoFocusEnabled = true            
    configuration.isLightEstimationEnabled = false
    configuration.maximumNumberOfTrackedImages = 0
    session.run(configuration)  

    spawnCoreMLUpdate()
}

func spawnCoreMLUpdate() {    // Spawning new async tasks

    dispatchQueue.async {
        self.spawnCoreMLUpdate()
        self.updateCoreML()
    }
}

func updateCoreML() {

    let pixelBuffer: CVPixelBuffer? = (session.currentFrame?.capturedImage)
    if pixelBuffer == nil { return }
    let ciImage = CIImage(cvPixelBuffer: pixelBuffer!)
    let imageRequestHandler = VNImageRequestHandler(ciImage: ciImage, options: [:])
    do {
        try imageRequestHandler.perform(self.visionRequests)
    } catch {
        print(error)
    }
}

标签: iosswiftaugmented-realityarkitdispatch-queue

解决方案


如果您想要将帧速率从 60 降低到 30 ,则应使用preferredFramesPerSecond. SCNView我假设您使用的是ARSCNView,它是 的子类SCNView

财产文件。


推荐阅读