如何更改 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 *
}
我目前正在努力限制我的 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 *
}