gpt4 book ai didi

ios - CADisplayLink 可以在应用程序处于后台时运行吗?

转载 作者:搜寻专家 更新时间:2023-10-31 08:04:50 27 4
gpt4 key购买 nike

我在我的应用程序中使用 CADisplayLink 作为计时器。我正在使用 CADisplayLink,因为我的应用程序非常依赖 CADisplayLink 的准确度/精度。就我而言,NSTimer 不是合适的替代品。

问题是,有时我需要 CADisplayLink 在应用程序处于后台时触发并调用其选择器。这可能吗?我知道 CADisplayLink 链接到应用程序 UI 的刷新率。这是否意味着,当我的应用程序在后台运行时,没有 UI,因此在这种情况下无法使用 CADisplayLink?或者,是否可以通过更改我添加它的运行循环或更改 forMode 参数来以某种方式使用 CADisplayLink?或者可能使用一些 GCD 技巧/解决方法?

注意:我的应用使用的是 AudioPlayer,因此我启用了后台功能。我可以在后台运行其他代码。只是为了测试,我用 NSTimer 切换了我的 CADisplayLink,然后 NSTimer 按我的意愿触发并调用了它的选择器。我只是无法启动 CADisplayLink,而且我找不到任何关于在后台使用它的可能性的权威文档

这是我当前与显示链接相关的代码:

func beginTimer(){

dispatch_async(dispatch_get_main_queue()){
self.displayLink = CADisplayLink(target: self, selector: "update")
self.displayLink.addToRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
}
}

func update(){
delegate?.executeCallback
}

最佳答案

显示链接回调未在后台调用是一种未记录的感觉,因为您无论如何都不应该绘制(事实上,如果您在后台执行任何 GPU 工作,您的应用程序就会被杀死)。

因此,如果您已经在使用音频和背景模式,为什么不尝试通过使用 remoteIO 音频单元* 和计算输出样本而不是屏幕刷新来实现您的计时?

通过此路径,您可以选择等于或小于通常的 60Hz 屏幕刷新率的输出缓冲区大小。

我认为您应该能够获得可比(甚至更好)的计时精度,尽管在低功耗模式/其他应用程序交互中会有一些警告,iOS 可能会选择从您下方更改您的缓冲区大小。需要进行一些实验。

*我不认为 AVAudioEngine 具有与此程序输出等效的功能。

关于ios - CADisplayLink 可以在应用程序处于后台时运行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35977411/

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