1

也就是说,如果

[self setNeedsDisplayInRect:rect];

被调用了,rect对需要重绘的区域进行了非常仔细的计算,但是如果我们的drawRect代码不关心rect,反正什么都画出来,iOS系统还能以某种方式提高绘制速度吗?(或者可能改进很少?)这个问题可能需要非常熟悉 UIKit/CoreGraphics 的人。

4

2 回答 2

2

有几种方法可以得到肯定的答案:

  1. 您可以剪辑到矩形,在这种情况下,即使您在其中绘制,也不会绘制矩形之外的任何内容。在矩形外绘图不是免费的,但会更便宜。iOS 无法为您执行此操作,因为您可能会故意忽略 rect,或者使用 rect 但还会无条件地在您的边界内的其他地方绘制其他内容。(尽管其他事情可能应该是另一种观点。)
  2. 即使您的当前 drawRect:不使用矩形,您也可以稍后返回该代码来优化它。正如您可能知道的那样,一种非常好的方法(如果可能的话)是使用矩形来决定您绘制的内容。即使您现在不这样做,将来也可能会这样做,并且现在指定更改的矩形意味着那时要更改的内容要少得多。
  3. #3 的一个推论是,即使您现在绘制的内容无法如此优化,您可能会决定在未来的主要版本中将视图绘制的内容完全更改为可以绘制的内容。同样,现在指定更改的矩形意味着将来要做的事情要少得多。
  4. 子视图。如果您的视图实际上并未绘制用户在其中看到的某些内容,而是将这些内容委托(不是 Cocoa/Cocoa Touch 意义上的)子视图,那么您可能会重写setNeedsDisplayInRect:以将消息发送到setNeedsDisplay:子视图——并且只有框架与矩形相交的子视图——在调用super. (并且 UIView 的实现可能已经这样做了。你应该测试它。)
于 2012-04-23T07:35:23.410 回答
1

如果您的drawRect:实现忽略传入的矩形并绘制整个视图,则传递给的矩形的任何优化setNeedsDisplayInRect:都是徒劳的。

“需求显示”矩形直接通过;它唯一的用途是drawRect:实现用于忽略不必要的绘图。一旦你的drawRect:实现被输入,系统就无法判断你在传递的矩形之外的绘制是否是故意的,所以所有的绘制都真的发生了(包括性能影响)。

根据您正在绘制的内容和方式,将您的drawRect:实现限制为至少使用传入的矩形并不难。您要绘制的所有内容都有一个边界矩形,无论是文本块还是贝塞尔路径或图像或只是一个矩形,你正在填充一些颜色。用测试围绕每一位绘图CGRectIntersectsRect()- 您不会以这种方式将绘图完全限制为传入的矩形,但您至少会消除需要绘制的任何不触及该矩形的东西。

于 2012-04-23T07:34:27.473 回答