我目前正在努力限制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
}
}
}
答案 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 *
}