iOS:当视图中有两个小的不相邻区域需要重绘时,调用两次 setNeedsDisplayInRect 是不是更快?
Posted
技术标签:
【中文标题】iOS:当视图中有两个小的不相邻区域需要重绘时,调用两次 setNeedsDisplayInRect 是不是更快?【英文标题】: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: 最终被调用的次数,或者最小化它必须重绘的屏幕区域数量,即使它必须重绘两次?
【问题讨论】:
【参考方案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 上调用一次更昂贵,我更愿意这样做。反之亦然。 这取决于您的应用需求。你必须选择以上是关于iOS:当视图中有两个小的不相邻区域需要重绘时,调用两次 setNeedsDisplayInRect 是不是更快?的主要内容,如果未能解决你的问题,请参考以下文章