swift 当我的iPhone上的iOS应用程序转换到效率核心时,其性能下降

g2ieeal7  于 2022-10-31  发布在  Swift
关注(0)|答案(2)|浏览(105)

我正在Xcode 12.4和iOS 14.3上开发一个实时视觉处理应用程序,遇到了一个问题,在随机打开一段时间后,应用程序停止使用我的iPhone的性能内核,转而使用效率内核。这伴随着FPS的显著下降。用于CPU大部分工作(通过cgContext渲染,然后使用CIImage(cgImage)转换)的队列如下:

private let dataOutputQueue = DispatchQueue(label: "video data queue", qos: .userInteractive, attributes: [.concurrent], autoreleaseFrequency: .workItem)

我很惊讶,一个.userInteractive队列会转移到像这样的效率核心,因为它无法跟上。
我的问题是,为什么性能内核会像这样停止工作?我不能假设我可以保留性能内核的使用吗?随附的仪器图片供参考。

icnyk63a

icnyk63a1#

我遇到过这个确切的问题(与上面相同的仪器跟踪),没有找到修复的代码解决方案。但是,我只能在iOS 14. x上重现。似乎在iOS 15. 1上,这不再是一个问题。
对我来说,这是非常确定的,在加载45 s +/-1 s后减速,关机5s +/- 5s,然后反弹。在iOS 14.x上,每次运行都会发生这种情况,但我还没有看到它在iOS 15上发生。
我已经打开了一个苹果技术支持请求,如果他们回应,将更新。

3b6akqbq

3b6akqbq2#

我的应用程序有时会在CPU被限制到性能核心的情况下启动,这对它造成了严重的伤害。这也发生在重新聚焦应用程序时,所以不是在一个新的开始上。
我已经确定我的iOS应用程序在UIApplication.shared.applicationState = .background状态下启动,然后快速移动到.active,这应该发生在将焦点移动到另一个应用程序时(我不确定它是否会发生,因为我一直在现场调试发布版本,所以我只能看到当前状态,而不是过去的状态(无日志记录))。
奇怪的是,统计数据中的FPS在节流期间保持在120fps,而不是在实际背景下。
完全放下控制中心全屏保护盖,然后将其关闭,会重置应用以使用性能核心或至少停止节流。其他遇到相同问题的人也发现了同样的问题,甚至更糟,首先是操作系统的半透明性导致了节流(iOS完全接管了性能核心以满足自己的需求)。
设置SCNView.rendersContinuously = false(我把它设置为true,因为转换到横向破坏了一些3D渲染的字体字形)似乎已经解决了这个问题。
我推测iOS会测量温度增量,并抢先影响具有某种持续CPU或GPU活动的应用程序,但有时会忘记关闭节流(去掉控制中心的全屏保护盖就可以了)。这很有意义,因为连续使用GPU或CPU很多时候最好委托给效率核心来保存电池,而最好将尖峰使用发送到性能核也以保存电池。
我还暂停了大多数CPU的使用,在任何状态以外的活动,所以不要强迫iPadOS要么杀死应用程序或移动到效率核心。

相关问题