在 iOS 上,如果 drawRect 不使用传入的矩形,那么 [self setNeedsDisplayInRect:rect] 传入的矩形是不是重要?
Posted
技术标签:
【中文标题】在 iOS 上,如果 drawRect 不使用传入的矩形,那么 [self setNeedsDisplayInRect:rect] 传入的矩形是不是重要?【英文标题】:On iOS, if drawRect doesn't use the rect that was passed in, does it matter if [self setNeedsDisplayInRect:rect] passes in a rect?在 iOS 上,如果 drawRect 不使用传入的矩形,那么 [self setNeedsDisplayInRect:rect] 传入的矩形是否重要? 【发布时间】:2012-04-23 07:08:57 【问题描述】:也就是说,如果
[self setNeedsDisplayInRect:rect];
被调用了,rect
被非常仔细的计算了需要重绘的区域,但是如果我们的drawRect
代码不关心rect
,反正都画出来了,ios系统还能不能有所改进绘图速度? (或者可能改进很少?)这个问题可能需要非常熟悉 UIKit/CoreGraphics 的人。
【问题讨论】:
【参考方案1】:有几种方法可以回答是的:
-
您可以剪辑到矩形,在这种情况下,不会绘制矩形之外的任何内容,即使您在其中绘制也是如此。在矩形外绘图不是免费的,但会更便宜。 iOS 无法为您执行此操作,因为您可能会故意忽略 rect,或者使用 rect 但还会无条件地在您的边界内的其他地方绘制其他内容。 (虽然其他的东西可能应该是另一种观点。)
即使您的 current
drawRect:
不使用矩形,您也可以稍后返回该代码来优化它。正如您可能知道的那样,一种非常好的方法(如果可能的话)是使用矩形来决定您绘制的内容。即使您现在不这样做,将来也可能会这样做,并且现在指定更改的矩形意味着那时要更改的内容要少得多。
#3 的一个推论是,即使您现在绘制的内容无法如此优化,您可能会决定在未来的主要版本中将视图绘制的内容完全更改为能够。同样,现在指定更改的矩形意味着将来要做的事情要少得多。
子视图。如果您的视图实际上并未绘制用户在其中看到的某些内容,而是将这些内容委托(不是 Cocoa/Cocoa Touch 意义上的)子视图,那么您可能会覆盖 setNeedsDisplayInRect:
以发送 setNeedsDisplay:
消息在调用super
之前,到子视图——并且仅帧与矩形相交的子视图。 (而且 UIView 的实现可能已经这样做了。您应该对其进行测试。)
【讨论】:
【参考方案2】:如果您的drawRect:
实现忽略传入的矩形并绘制整个视图,则传递给setNeedsDisplayInRect:
的矩形的任何优化都是徒劳的。
“需要显示”矩形直接通过;它唯一的作用是drawRect:
实现用于忽略不必要的绘图。一旦你的drawRect:
实现被输入,系统就无法判断你在传递的矩形之外的绘制是否是故意的,所以所有的绘制都真的发生了(包括性能影响)。
根据您要绘制的内容和方式,将drawRect:
实现限制为至少使用传入的矩形并不难。您要绘制的所有内容都有一个边界矩形,无论它是一个块文本或贝塞尔路径或图像或只是一个矩形,您正在填充一些颜色。用CGRectIntersectsRect()
测试围绕每个位进行绘图——您不会以这种方式将绘图完全限制为传入的矩形,但您至少会消除需要绘制的任何不触及该矩形的东西。
【讨论】:
所以我想如果我的绘图占用了大部分 CPU 时间,那么它就没有帮助。 GPU 节省的将那个小矩形传输到当前显示缓冲区或其他任何东西的时间可能会有所帮助,而且它可能非常小?以上是关于在 iOS 上,如果 drawRect 不使用传入的矩形,那么 [self setNeedsDisplayInRect:rect] 传入的矩形是不是重要?的主要内容,如果未能解决你的问题,请参考以下文章
在 iPhone 和 iPad 上,我们可以在不使用 drawRect 的情况下绘制任何东西吗?
在 iOS 上,setNeedsDisplay 真的不会导致 drawRect 被调用...除非 CALayer 的 display 或 drawInContext 最终调用 drawRect?