如何更改ARKit更新功能频率(FPS)?

时间:2019-02-17 23:11:13

标签: ios swift arkit

我目前正在努力限制ARKit iOS应用程序的CPU负载。为此,我需要限制会话每秒的时间(_ didUpdate:每秒被调用。我尝试更改ARSCNView的preferredFramesPerSecond属性。这确实降低了传入视频源的fps,但是更新功能仍然每秒被称为疯狂次数。我的另一种解决方案是使用传入的ARFrame的timeStamp属性并计算上次保存的渲染时间之间的差值。我正在尝试在Swift Playgrounds上运行该程序以及由于某种原因而无法在类型为TimeInterval的render循环中设置变量。此解决方案在普通的iOS应用上确实有效。是否有任何正确的方法来直接为ARKit设置更新功能的频率?

当前代码:

我的AR属性:

private lazy var lastRenderTime = Date().timeIntervalSince1970

private lazy var sceneView: ARSCNView = {
    let sceneView = ARSCNView()
    sceneView.session.delegate = self
    sceneView.preferredFramesPerSecond = 30
    sceneView.debugOptions = [.showFeaturePoints]
    sceneView.translatesAutoresizingMaskIntoConstraints = false
    return sceneView
}()

和委托实现:

extension MainViewController: ARSessionDelegate {
    func session(_ session: ARSession, didUpdate frame: ARFrame) {
        let timeSinceLastUpdate = lastRenderTime - frame.timestamp

        if timeSinceLastUpdate >= 0.1 || timeSinceLastUpdate < 0 {
            lastRenderTime = frame.timestamp
            // Do Updating Stuff
        }
    }
}

1 个答案:

答案 0 :(得分:0)

因此,我遇到了同样的问题,并且找到了解决该问题的不错的解决方法。您可以设置一个计时器变量,并基于计时器,然后在didUpdate函数中调用所需的任何内容。我将在下面提供一些代码示例,该示例每0.5秒调用一次会话Didupdate框架函数。 (您可以对其进行更改,以使其看起来最合适)

代码示例:

//setting up timer variables and functions 
    var time = 0.0
    var timer = Timer()

    func startTimer() {
        timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(updateTime), userInfo: nil, repeats: true)
    }

    func resetTimer() {
        timer.invalidate()
        time = 0
        startTimer()
    }

    @objc func updateTime() {
        if time < 0.5 {
           time += 0.1
        } else {
            resetTimer()
        }
    }

在您的viewdidload或viewwill会出现呼叫

startTimer()

最后,在didUpdate函数中创建条件语句

if time != 0.5 {
   return
} else {
   * your code * 
}