我有一个 iOS 应用程序,可以从设备摄像头抓取帧并进行一些 CPU 密集型图像处理。在 iPad 2、iPad 3 和 iPhone 4s 上,该应用程序以每秒 30 帧 (fps) 的速度运行。我最近在 iPhone 5 上对其进行了测试,大多数时候它的运行速度为 30 fps。有时我注意到它会下降到 15 fps 左右,这是我在其他设备(据说硬件速度较慢的设备)上从未经历过的情况。我努力寻找这个问题,并且学到了很多东西,但没有找到解释。以下是我的一些观察结果,可能会为正在发生的事情提供线索:
- 这只发生在 iPhone 5 上
- 尝试在手机上分析应用程序时无法重现该问题
- 应用程序在多个线程上运行,帧抓取并将图像转换为我所需的格式在单独的线程上运行以进行密集的图像处理。帧抓取线程永远不会低于 30fps,只有图像处理线程会下降。这意味着我的问题不是由于相机帧速率由于某种原因(例如低光照水平)下降所致。
- 我倾向于通过启动应用程序、点击 iPhone 的待机按钮、点击主页按钮并返回应用程序来重现问题。如果我重复此操作 3-6 次,问题经常会发生(但并非总是如此)。
- 似乎与 iOS 6.0 无关,它在装有 iOS 6 的 4s 上运行良好。
- 出现问题时,即使终止应用程序并重新启动,通常也无法恢复帧速率(这表明这是我的应用程序之外与 iPhone 5 相关的问题)。
- 将手机连接到计算机并重建应用似乎总能解决帧速率问题。
这很奇怪。难道 iPhone 5 有时会降低手机的时钟速度以延长电池生命周期(iPad 和 iPhone 4s 不会这样做)?
我很想听听有类似经历的人的意见。
我的应用程序在 iPhone 5 上看起来不应该更差,它应该看起来更好!
提前非常感谢,
凯文
更新
我又做了一些测试,但仍然没有发现问题。这是我尝试过的。
- 我已经删除了线程
- 我删除了一些我正在使用的第三方
- 删除了所有日志记录
- 尝试在仪器中重新创建但失败。仪器中不会出现该问题
我已经没有主意了。希望听到有人在 iPhone 5 上遇到帧速率下降的情况吗? iPhone 5 有省电模式吗?
最佳答案
最可能的原因是代码中的竞争条件,该条件只会被 iPhone 5 上的特定时间触发。我会四处寻找有资源争用的任何地方,并确保正确处理它们,尤其是在您执行超时的任何地方(因为您没有完全死锁或崩溃)。
您提到您正在多个线程上运行。您的意思是您正在使用 NSThread
、performSelectorInBackground:
、NSOperation
或 GCD?直接使用 NSThread
是导致线程和资源问题的常见原因,因为使用它比使用 NSOperation
或 GCD 更难正确执行操作。
如果你曾经调用performSelectorInBackground:
,我会高度怀疑这段代码,因为这个调用非常容易被错误使用(并且几乎不应该被使用)。离开应用程序并重新启动它往往会导致问题,这一事实尤其让我怀疑您在 View Controller 中手动生成线程(这是一个常见的错误)。 performSelectorInBackground:
的问题在于,没有简单的方法可以知道您已经为此生成了一个线程。因此,您最终可能会获得比预期更多的线程。
与所有性能方面一样,您应该从乐器开始。特别注意时间分析器和线程工具。
造成此类问题的另一个常见原因是:审核您对 NSLog
的使用。它非常慢且同步。在多个线程上运行它会显着影响性能。
关于ios - 仅 iPhone 5 出现无法解释的帧速率下降,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13862743/