【问题标题】:iOS: Faster to call setNeedsDisplayInRect twice when there are two small, non-adjacent areas of the view that need redrawing?iOS:当视图中有两个小的不相邻区域需要重绘时,调用两次 setNeedsDisplayInRect 是否更快?
【发布时间】:2011-07-23 12:13:51
【问题描述】:

假设我的视图中有两个非常小的区域需要重绘。一个在左上角,另一个在右下角。我可以使用它们的坐标将包含两个区域的单个大 CGRect 传递给 setNeedsDisplayInRect,但这最终会包括许多其他不需要需要重绘的区域。

所以另一种选择是简单地将包含 CGRects 的个体传递给 setNeedsDisplayInRect,一个接一个,即

[self.view setNeedsDisplayInRect:rectForArea1]
[self.view setNeedsDisplayInRect:rectForArea2]

通常哪个会更快?最小化 drawRect: 最终被调用的次数,或者最小化它必须重绘的屏幕区域数量,即使它必须重绘两次?

【问题讨论】:

    标签: ios cocoa-touch drawing drawrect


    【解决方案1】:

    没关系。如here 所述,iOS 将始终更新整个视图,与您传递给 setNeedsDisplayInRect 的矩形无关:

    请注意,由于 iPhone/iPod touch/iPad 更新其 屏幕,如果您调用,整个视图将被重绘 -setNeedsDisplayInRect: 或 -setNeedsDisplay:.

    【讨论】:

      【解决方案2】:

      这取决于那两个矩形。

      如果两个边界加法都是视图边界的 75%,那么我将调用简单的调用

          [self.view setNeedsDisplay];
      

      因为我们几乎绘制了整个视图。

      如果两个边界加法都低于视图边界的 50%,那么我将调用简单的调用

          [self.view setNeedsDisplayInRect:rectForArea1];
      
          [self.view setNeedsDisplayInRect:rectForArea2];
      

      因为我们需要画小空间

      【讨论】:

      • 你能提供什么来支持这些选择吗?例如,在我看来,只要重新绘制区域超过屏幕的 75% 时简单地调用 setNeedsDisplay 就有点懒惰了。尽管重绘是屏幕的大部分内容,但您仍然需要重绘很多不需要的内容,因此可以提高效率。并且根据屏幕最后 25% 的内容,额外的重新绘制可能会非常昂贵。
      • 如果你不关心需要显示方法调用的次数,那么就只画矩形
      • 但我确实在乎。我这篇文章的全部目的是找出实现相同目标的最有效方法。因此,如果在不同的小型 CGRect 上多次调用 drawRect: 比在大型 CGRect 上调用一次更昂贵,我更愿意这样做。反之亦然。
      • 这取决于您的应用需求。你必须选择
      猜你喜欢
      • 2014-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多