【问题标题】:What's causing the delay in my segues?是什么导致我的 segues 延迟?
【发布时间】:2013-01-12 15:10:56
【问题描述】:

当我点击返回按钮时,我的一个视图会冻结几秒钟。

此外,当我点击此视图中的一个项目时,它会显示一个弹出窗口(自定义,而不是 UIPopoverController)。这个弹出窗口看起来很快,但是当我“翻转”弹出窗口以查看它的背面时,会出现同样长的延迟。

我怀疑原因与视图的复杂性有关。正如您在下面的屏幕截图中看到的,它是一个集合视图,它有一个背景,并且一些子视图是旋转的(UIViewEdgeAntialiasing 已打开)。

我使用 Instruments 中的 Time Profiler 来弄清楚发生了什么,但我被卡住了。

除非我取消选择“隐藏系统库”,否则我看不到任何有用的东西:

如果我查看方法名称,我认为它们与自动布局有关。这表明它试图在 segue 期间渲染一些东西。但不会调用cellForItemAtIndexPath等方法。

这个应用程序还有一个 iPhone 版本,我根本没有遇到这个问题。它使用 tableview 而不是 collectionview。它还有背景和旋转图片。

我使用模拟器进行了这些测量;在我的 iPad Mini 上情况更糟;动画开始前最多可能需要 20 秒。

更新 - 感谢您的回答,我尝试过的事情:

  • 关闭UIViewEdgeAntialiasing:对性能没有影响

【问题讨论】:

    标签: ios performance instruments autolayout uistoryboardsegue


    【解决方案1】:

    旋转是这里的坏人。每个UICollectionViewCell 都有一个UIView 作为容器视图,其中有一个UIImageView。我像这样旋转它:

    container.transform = CGAffineTransformMakeRotation(M_PI * someRandomFloat);

    删除那条线,一切都变得活泼了。

    我在 iPhone 上使用了相同的技术,但显然这种旋转对UITableViewCell 的性能影响比在UICollectionViewCell 中要小。

    我尝试子类化UICollectionViewFlowLayout 来旋转单元格本身而不是一个子视图。不幸的是,这会导致类似的性能问题。

    【讨论】:

      【解决方案2】:

      我认为这可能是由于 UIViewEdgeAntialiasing 标志。看起来你的主视图(有很多轻微旋转的图片)有很多抗锯齿边缘,因此对 iPad 的 GPU 非常不利。当您的弹出框旋转时(即当背景再次显示时)绘图性能会减慢这一事实证明了这一点。

      尝试将其关闭,看看性能是否有所改善。它看起来怎么样?

      【讨论】:

      • 谢谢,但不幸的是,这并没有提高性能。它只是导致锯齿状边缘。但我会尝试去掉其他一些“特殊效果”,看看是否有帮助。
      • 原来是轮换,我会在自己的回答中解释。
      猜你喜欢
      • 2020-03-04
      • 2015-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-03
      • 2020-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多