【问题标题】:UIScrollView Performance Tips?UIScrollView 性能提示?
【发布时间】:2012-10-15 23:55:38
【问题描述】:

我有一个 UIScrollView 动画很多 UIViews(可能太多)。此外,这些 UIView 代表“页面”,有时多个页面相互堆叠,形成“一堆”页面(通过将子视图添加到给定视图来设置)。

我知道滚动过多的 UIView 可能会导致性能下降,但我想知道是否有人对我有一些提高性能的一般提示?

目前,我不想考虑在 drawRect 中手动绘制,因为它会弄乱各种“页面堆”动画。我会在万不得已的时候记住它,但如果可能的话,我绝对想避免它。

更新: 性能下降的原因已经确定,有两个方面:我在所有 UIView 上都使用了抗锯齿和阴影。当我将它们都关闭时,性能问题就解决了!但是,我显然不想只是将它们关闭:)

我正在像这样创建我的阴影:

self.imageView.layer.opaque = YES;
        self.imageView.layer.masksToBounds = NO;
        self.imageView.layer.shadowOffset = CGSizeMake(-4, 0);
        self.imageView.layer.shadowRadius = 2.5;
        self.imageView.layer.shadowOpacity = 0.15;
        self.imageView.layer.shadowPath = [UIBezierPath bezierPathWithRect:CGRectMake(
                                                                                      self.bounds.origin.x,
                                                                                      self.bounds.origin.y,
                                                                                      self.bounds.size.width + 8,
                                                                                      self.bounds.size.height + 2)].CGPath;

有什么提高性能的技巧吗?

就抗锯齿而言,它几乎是必需品。问题是那些“偏移页面”略微旋转并且我的页面有 1 像素边框。用 1 像素边框稍微旋转而没有抗锯齿看起来很糟糕。我只是通过将“使用边缘抗锯齿渲染”设置为 YES 来在 .plist 中启用抗锯齿。

如有任何关于如何提高我的阴影/抗锯齿性能的建议,我们将不胜感激。

【问题讨论】:

  • 一个提示是尽可能使用 CATiledLayer。这将通过将渲染分成可由多个内核处理的块来加速渲染。
  • 您是否考虑过在一个单独的视图中显示每个页面,而不是滚动视图,您可以通过一个简单的动画来浏览?
  • 你提到这很有趣,它实际上已经存在!详细说明...我正在谈论的 UIScrollView 显示了多个文档,每个文档都可能包含多个页面。 “堆叠页面”效果是通过添加额外的 UIView 并偏移它们来实现的(最多显示 4 个偏移页面以限制额外的 UIView),但这会造成 UIView 过多,降低滚动性能(我认为)。如果您点击一个文档,会有一个精美的动画,然后您会转到您提到的那个单独的视图,您可以在其中弄乱页面:)(我认为这就是您的意思)

标签: ios performance uiscrollview


【解决方案1】:

有多少 UIView 是“很多”?我们在谈论什么样的观点? 如果不需要复杂的绘图,100 个 UIView 通常不是问题。 但是,呈现 PDF 的 10 个UIWebView 实例是另一回事...

确保您的视图仅在必要时进行布局和绘制(= 仅当它们实际可见时)。例如,您可以通过在视图的 layoutSubviews 中创建断点来检查这一点。

此外,尽可能使用不透明的UIView 元素。这使得绘制更加高效,因为不必绘制不透明元素下方的视图。

如果您碰巧有需要大量处理但很少更改的自定义 CALayer 实例(例如带有阴影的 CAShapeLayer 等),您可能需要考虑在这些实例上启用光栅化:yourLayer.shouldRasterize = YES; 这通过缓存渲染的合成图像来加速绘图。

【讨论】:

  • 好的,我做了更多调查,并缩小了问题范围。将更新主要问题。但是你帮助我意识到我真的没有展示那么多 UIView,所以性能问题必须(并且)与另一个问题相关:抗锯齿和阴影。
  • 为了回答你的问题,总共大概有 45-60 次观看(其中 15-20 次有阴影)
  • @MikeS:您已经完成了提高性能最重要的事情:设置shadowPath。您是否尝试在有阴影的图层上启用光栅化?
  • 奇怪的是,启用光栅化会损害性能而不是帮助它。是的,我学到了一个艰难的方法,即在没有 shadowPath 的情况下创建阴影通常会导致性能不佳。
  • @MikeS:光栅化仅在不需要经常绘制视图的情况下才能提高性能。我想重叠的图层会导致很多绘图。在我的 iPhone 4S 上,一个带有 12 UIImageViews 和大阴影的小型演示项目滚动得非常好,所以我想你的视图或它们下面的视图有些不同。
猜你喜欢
  • 2012-11-30
  • 1970-01-01
  • 2010-10-30
  • 2015-02-08
  • 1970-01-01
  • 1970-01-01
  • 2011-08-05
  • 1970-01-01
  • 2011-04-09
相关资源
最近更新 更多