我有一个iOS应用程序,可以从设备摄像头抓取帧,并进行一些CPU密集型图像处理。在iPad 2,iPad 3和iPhone 4s上,应用程序以每秒30帧(fps)的速度运行。我最近在iPhone 5上进行了测试,大部分时间都以30 fps运行。偶尔我注意到它下降到大约15 fps,这是我从未在其他设备上遇到的东西(据称硬件速度较慢的设备)。我已经努力追踪这个问题了,我已经学到了很多东西,但没有找到解释。以下是我的一些观察结果,可能会提供正在发生的事情的线索:
这很奇怪。可能是iPhone 5有时会降低手机的时钟速度以帮助延长电池续航时间(iPad和iPhone 4s没有这种方式)?
我很想听到有类似经历的人的消息。
我的应用程序在iPhone 5上应该看起来不应该看起来更好看!
非常感谢,
凯文
更新
我已经做了一些测试,但仍然没有发现问题。这就是我的尝试。
我已经没想完了。喜欢听到任何一个在iPhone 5上体验帧速率下降的人的消息? iPhone 5是否具有省电模式?
答案 0 :(得分:2)
最可能的原因是代码中的竞争条件只会被iPhone 5上的特定时序绊倒。我会四处寻找有资源争用的地方并确保您正确处理它们,尤其是你执行超时的任何地方(因为你没有完全死锁或崩溃)。
你提到你在多个线程上运行。您的意思是说您使用的是NSThread
,performSelectorInBackground:
,NSOperation
或GCD吗?直接使用NSThread
是线程和资源问题的常见原因,因为使用NSOperation
或GCD比使用它更难做正确的事。
如果您曾打电话给performSelectorInBackground:
,我会高度怀疑这段话的代码是非常容易错误地使用(而且几乎不会被使用)。离开应用程序并重新启动它的事实往往会导致问题特别让我怀疑你是在视图控制器中手动生成线程(这是一个常见的错误)。 performSelectorInBackground:
的问题在于,没有简单的方法可以知道您已经已经为此产生了一个线程。所以你可以获得比你想要的更多的线程。
与所有表演事物一样,你应该从乐器开始。特别要注意时间分析器和穿线工具。
这种问题的另一个常见原因是:审核您对NSLog
的使用。这是非常缓慢和同步的。在多个线程上运行它会显着影响性能。