gpt4 book ai didi

ios - CADisplayLink 无法在模拟器中实现恒定的帧速率

转载 作者:行者123 更新时间:2023-11-29 05:28:14 26 4
gpt4 key购买 nike

我正在尝试使用CADisplayLink来实现游戏循环的恒定帧速率。当在模拟器中测试它时,我无法实现稳定的时间范围。我应该考虑采用不同的方法吗?

或者这只是因为模拟器无法正确模拟硬件?

根据 Apple,这是计算 FPS 的方法:

let actualFramesPerSecond = 1 / (displaylink.targetTimestamp - displaylink.timestamp)

在我为测试而设置的普通 iOS 应用程序中,它会打印恒定的帧速率:

 FPS: 59.99999875668439
FPS: 59.99999875668439
FPS: 59.99999875668439
FPS: 59.99999875668439
FPS: 59.99999875668439

但是,当我使用实际耗时计算 FPS 时,它给出了其他内容:

 FPS: 64.35942918520792
FPS: 58.30848150362142
FPS: 57.640194044003465
FPS: 64.47022656706324
FPS: 59.392580005664115
FPS: 60.282043174566674

另外,当使用代码渲染一些 Sprite 时,它在模拟器中看起来不稳定。上面的代码片段怎么可能与现实相差如此之大?

我主要关心的是:为什么以 Apple 方式计算 FPS 时帧速率是恒定的?他们的文档是否可能只包含一些小故障?此外,当有一些负载时,“实际”值是预期的,但是对于不执行任何操作的空循环?

这是我用来执行游戏循环的代码:

private var previousTimeInSeconds: Double = 0

private lazy var displayLink: CADisplayLink = {
let displayLink = CADisplayLink(target: self,
selector: #selector(displayLoop))
return displayLink;
}()

private func startLoop() {
previousTimeInSeconds = Date().timeIntervalSince1970
displayLink.add(to: .current, forMode: .common)
}

@objc private func displayLoop() {
let currentTimeInSeconds = Date().timeIntervalSince1970
let elapsedTimeInSeconds = currentTimeInSeconds - previousTimeInSeconds
previousTimeInSeconds = currentTimeInSeconds

//let actualFramesPerSecond = 1 / (displayLink.targetTimestamp - displayLink.timestamp) // is showing constant 59.xxx FPS
let actualFramesPerSecond = 1 / elapsedTimeInSeconds

print("FPS: \(actualFramesPerSecond)") // varies from 50.xxx to 70.xxx FPS
/*
FPS: 64.35942918520792
FPS: 58.30848150362142
FPS: 57.640194044003465
FPS: 64.47022656706324
FPS: 59.392580005664115
FPS: 60.282043174566674
*/
}

最佳答案

我想我找到了答案。不要使用 Date().timeIntervalSince1970 来计算每秒的各个帧速率。好像还不够精确。

而是使用 displayLink.timestamp,它是与显示的最后一帧关联的时间值。将上面代码中的 Date() 用法替换为 timestamp,您将获得预期的 FPS 值:

FPS: 59.99999875668439
FPS: 59.99999896623196
FPS: 59.99999875668439
FPS: 59.99999875668439
FPS: 59.99999875668439
FPS: 29.999999430729087
FPS: 59.99999875668439
FPS: 59.99999875668439
FPS: 59.99999875668439
FPS: 59.99999875668439
FPS: 59.99999896623196
FPS: 59.99999875668439
FPS: 59.99999875668439
FPS: 59.99999875668439
FPS: 59.99999896623196

如您所见,它的帧率基本稳定在 59 FPS,偶尔会有一些下降,这完全在意料之中,因为不能保证以恒定速率调用 CADisplayLink。但在(几乎)没有代码执行的“劳动情况”下,这是您可以预期的帧速率。

如果想计算真实的帧速率时间,我从Apple文档中获取的公式(“让actualFramesPerSecond = 1/(displayLink.targetTimestamp - displayLink.timestamp)”)有点无用。相反,它表明可以使用 targetTimestamp 来实现稳定的游戏循环(因为结果值确实是一个常量)。我希望文档能够更清楚地表达这一点。

关于ios - CADisplayLink 无法在模拟器中实现恒定的帧速率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57937529/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com