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 是不是更快?的主要内容,如果未能解决你的问题,请参考以下文章

自定义视图在缩放后重绘时如何防止“反弹”效果?

SwiftUI:ObservableObject 在重绘时不会保持其状态

TabView 在重绘时是不是会错过导航点击?

窗口重绘

在 MFC 中重绘时闪烁

重绘时文本字段变形