草庐IT

ios - 仅在 iPhone 5 上无法解释的帧率下降

coder 2024-01-20 原文

我有一个 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 上的特定时间触发。我会四处寻找你有资源争用的地方,并确保你正确地处理它们,尤其是在您执行超时的任何地方(因为您没有完全死锁或崩溃)。

您提到您在多个线程上运行。您是说您正在使用 NSThreadperformSelectorInBackground:NSOperation 还是 GCD?直接使用 NSThread 是线程和资源问题的常见原因,因为使用它比使用 NSOperation 或 GCD 更难正确地做事。

如果您曾经调用过 performSelectorInBackground:,我会高度怀疑这段代码,因为这个调用非常容易被错误使用(而且应该永远不会被使用)。离开应用程序并重新启动它往往会导致问题,这一事实尤其让我怀疑您是在 View Controller 中手动生成线程(这是一个常见的错误)。 performSelectorInBackground: 的问题在于,没有简单的方法可以知道您已经为此生成了一个线程。因此,您最终可以得到比预期更多的线程。

与所有性能相关的东西一样,您应该从 Instruments 开始。请特别注意时间分析器和线程工具。

这种问题的另一个比较常见的原因是:审核您对 NSLog 的使用。它非常慢且同步。在多个线程上运行它会显着影响性能。

关于ios - 仅在 iPhone 5 上无法解释的帧率下降,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13862743/

有关ios - 仅在 iPhone 5 上无法解释的帧率下降的更多相关文章

  1. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  2. ruby-on-rails - 无法使用 Rails 3.2 创建插件? - 2

    我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby​​1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在

  3. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  4. ruby-on-rails - 无法在centos上安装therubyracer(V8和GCC出错) - 2

    我正在尝试在我的centos服务器上安装therubyracer,但遇到了麻烦。$geminstalltherubyracerBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtherubyracer:ERROR:Failedtobuildgemnativeextension./usr/local/rvm/rubies/ruby-1.9.3-p125/bin/rubyextconf.rbcheckingformain()in-lpthread...yescheckingforv8.h...no***e

  5. ruby - 无法让 RSpec 工作—— 'require' : cannot load such file - 2

    我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳

  6. ruby - 无法覆盖 irb 中的 to_s - 2

    我在pry中定义了一个函数:to_s,但我无法调用它。这个方法去哪里了,怎么调用?pry(main)>defto_spry(main)*'hello'pry(main)*endpry(main)>to_s=>"main"我的ruby版本是2.1.2看了一些答案和搜索后,我认为我得到了正确的答案:这个方法用在什么地方?在irb或pry中定义方法时,会转到Object.instance_methods[1]pry(main)>defto_s[1]pry(main)*'hello'[1]pry(main)*end=>:to_s[2]pry(main)>defhello[2]pry(main)

  7. ruby - 无法在 60 秒内获得稳定的 Firefox 连接 (127.0.0.1 :7055) - 2

    我使用的是Firefox版本36.0.1和Selenium-Webdrivergem版本2.45.0。我能够创建Firefox实例,但无法使用脚本继续进行进一步的操作无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055)错误。有人能帮帮我吗? 最佳答案 我遇到了同样的问题。降级到firefoxv33后一切正常。您可以找到旧版本here 关于ruby-无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055),我们在StackOverflow上找到一个类

  8. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  9. ruby - 有人可以帮助解释类创建的 post_initialize 回调吗 (Sandi Metz) - 2

    我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法

  10. ruby - 安装 Ruby 时遇到问题(无法下载资源 "readline--patch") - 2

    当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub

随机推荐