2

我有一个 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 有省电模式吗?

4

1 回答 1

2

最可能的原因是您的代码中的竞争条件只会被 iPhone 5 上的特定时间触发。我会四处寻找您有资源争用的任何地方,并确保您正确处理它们,尤其是您在任何地方执行超时(因为您没有完全死锁或崩溃)。

你提到你在多个线程上运行。您的意思是您正在使用NSThreadperformSelectorInBackground:NSOperation或 GCD 吗?直接使用NSThread是线程和资源问题的常见原因,因为使用它比使用NSOperationGCD 更难正确执行操作。

如果你曾经调用performSelectorInBackground:,我会高度怀疑那段代码,因为这个调用非常容易被错误地使用(并且几乎不应该被使用)。离开应用程序并重新启动它往往会导致问题,这一事实尤其让我怀疑您在视图控制器中手动生成线程(这是一个常见错误)。问题performSelectorInBackground:在于,没有简单的方法可以知道您已经为此生成了一个线程。所以你可能会得到比你想要的更多的线程。

与所有性能方面一样,您应该从 Instruments 开始。特别注意时间分析器和线程仪器。

此类问题的一个更常见的原因是:审核您对NSLog. 它非常缓慢且同步。在多个线程上运行它会显着影响性能。

于 2012-12-13T15:36:03.583 回答