【问题标题】:CPU usage dropping as UIScrollView gets larger?随着 UIScrollView 变大,CPU 使用率下降?
【发布时间】:2014-11-18 01:54:44
【问题描述】:

遇到一个奇怪的现象。我的应用程序是围绕垂直 UIScrollView(即“提要”)构建的,它本质上是一个活动时间线,很像 Facebook 的。当用户滚动到底部时,Feed 可以以 20 块为单位加载较旧的项目。

前 0-20 个项目(默认加载)快速滚动,当添加项目 20-40 时它会继续快速滚动,但是当添加项目 40-60 时性能会显着下降,并且应用程序在 60-80 时基本上无法使用已添加。

非常奇怪的是整个场景中的 CPU 使用率:

  • 20 个 Feed 项(默认):CPU 65%
  • 40 个提要项:CPU 40%,线程 1 活动下降约 25%(目测)
  • 60 个提要项:CPU 18%,线程 1 比之前下降 50%
  • 80 个提要项:CPU 7%,线程 1 再次比上一个下降 50%

这让我相信性能不足不是滚动视图的大小,而是导致 CPU 以某种奇怪的方式脱离自身的其他原因。您预计 CPU 利用率会增加,而不是减少。

我以为我可能无意中添加了不在主线程上的新提要项目并以某种方式搞砸了,但事实并非如此。

有什么想法吗?

仅供参考(运行 iOS8 的 iPhone 5,使用 iOS 8 SDK 构建的应用程序,我认为在 iOS 7 上运行 iOS 7 SDK 构建时我没有遇到这种情况。性能下降,但是,IIRC,可以预见 UIScrollView 大小 - 我将尝试确认)。

更新 我刚刚在运行 iOS 7.0.6 的 iPhone 4S 上使用 7 SDK 和 8 SDK 构建并运行了该应用程序。它没有显示相同的问题。 ScrollView 性能的下降更加可预测,并且 CPU 使用率不会随着 UIScrollView 大小的增加而下降。 iOS 8 中的错误??

【问题讨论】:

    标签: ios objective-c uiscrollview ios8 cpu-usage


    【解决方案1】:

    您应该考虑切换到 UITableView。它们旨在避免这个确切的问题。当单元格离开视图时,它们会重新用于现在正在使用的单元格。这样可以避免分配这么多。这就是为什么您的联系人列表、iPod 歌曲、Facebook 提要等在表格变大时不会降级的原因。

    【讨论】:

    • 嗯..好点。将是一个相当大的重构,但可能值得探索。
    • 我用子类 UITableView 而不是 UIScrollView 替换了它。我正在拦截 UIScrollView 的委托消息以具有一些特殊的滚动行为,并且从未考虑过我仍然可以使用 UITableView 拦截它们。性能问题已修复 - 尽管我仍然相信 iOS 8 中的 UIScrollView 存在一些奇怪的行为。谢谢!
    • 是的。 UITableView 继承自 UIScrollView,所以你可以用滚动做很多很酷的事情。我已经看到 iOS8 中 UIScrollViews 中的按钮存在一些问题,所以你可能是对的。
    【解决方案2】:

    我遇到了同样的问题。基本上我开发了一个滚动视图,里面有很多子视图,在 iOS8 出来之前,它在 iOS 7 上运行得非常流畅,但是当我用新的 iOS8 设备测试时(XCode5 因为 XCode6 太糟糕了),滚动视图变得非常慢并且与 iOS7 相比,响应速度较慢。

    请注意,我没有更改任何代码,这太奇怪了。所以我决定做一个演示,看看 iOS7 和 iOS8 上发生了什么。事实证明,iOS8 使用的内存似乎比 iOS7 多,即使代码/资产完全相同。因此,从 iOS7 到 iOS8 的性能会下降,理论上性能在较新的 iOS 上应该会变得更好。

    对我来说,苹果似乎有点急于发布 iOS8,但没有确保一切都经过完善和良好测试

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      相关资源
      最近更新 更多