如何更改 ARKit 更新函数频率 (FPS)?

How to Change ARKit Update Function Frequency (FPS)?

我目前正在努力限制我的 ARKit iOS 应用程序的 CPU 负载。为此,我需要限制每秒调用 session(_ didUpdate: 函数的时间。我尝试更改我的 ARSCNView 的 preferredFramesPerSecond 属性。这确实减慢了 fps传入的视频提要,但更新功能仍然每秒被调用的次数非常多。我的另一个解决方案是使用传入 ARFrame 的时间戳 属性 并计算上次保存的渲染时间之间的差异。我是尝试 运行 Swift Playgrounds 上的程序,无论出于何种原因,渲染循环中类型为 TimeInterval 的变量设置失败。此解决方案在普通 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
        }
    }
}

所以我遇到了同样的问题,我找到了解决这个问题的好方法。您可以设置一个计时器变量,然后根据计时器在 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 或 viewwillappear 调用中

startTimer()

最后在你的 didUpdate 函数中做一个条件语句

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