- [CALayer setNeedsDisplayInRect:]导致重绘整个图层

Tob*_*zer 8 cocoa-touch core-graphics calayer ios

我正在继承CALayer以提供我自己的方法绘图.为了优化,我打电话给-[MyLayer setNeedsDisplayInRect:]而不是-[MyLayer setNeedsDisplay].在绘图方法中,我得到了应该重绘的矩形CGContextGetClipBoundingBox().

如果我使用这个层作为UIView 的基础层,每个东西都按预期工作.一旦我将自定义图层用作其他CALayer的子图层,就会出现问题.比CGContextGetClipBoundingBox()始终返回层的边界的矩形.

有任何想法吗?

[编辑]

看来,没有保证,CALayer的内容被缓存,只有脏部分被重绘.我做了一个小测试,并将需要显示的矩形存储为一个单独的属性.结果是,只有这部分在屏幕上可见.

我现在将渲染到图像上下文并将该图像保存为缓存.在绘制方法中,我只显示缓存的图像.

Dan*_*maa 6

遗憾的是,Apple的文档存在冲突,因为-setNeedsDisplayInRect上的文档未指明该方法是否在实践中有效.根据我自己的经验,这个技术说明直截了当:

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

话虽如此,如果您认为由于冗余绘图而撞墙,您可以查看很多内容.

  • 如果绘制图像,您可以进行的最大性能改进是使用与您绘制的尺寸相同的图像.如果不是,请尝试通过将图像渲染到某些屏幕外位图上下文来缓存图像,并在以后将其恢复.
  • 查看shouldRasterizeCALayer上的酒店.如果您试图操纵其子图层可能构成复杂图层层次结构的图层,则这可能是天赐之物.请务必勾选Color Hits Green and Misses RedCore Animation乐器中的方框,了解您在乐器方面的表现.如果你看到很多红色,那么使用shouldRasterize它的可能性就会大大超过它的帮助.
  • 甚至比shouldRasterize展平图层层次更好,因为这样可以避免在shouldRasterize实时展平图层层次时产生的额外开销.当然这并非总是可行,但不要害怕尝试:)
  • 如果您正在绘制图像,请尝试尝试混合模式.如果您正在绘制不透明图像,则无需使用常规源代码方法(使用读/写带宽).尝试使用kCGBlendModeCopy,它可以消除读带宽开销.
  • 查看CGLayerRef,它允许您通过对绘图方法的各种调用来缓存Core Graphics输出.我的经验是,除非你正在做一些硬核像素推送,否则这最终会比重绘更昂贵.看到这个有趣的阅​​读.
  • 最重要的是,仪器是你的朋友.查看过去WWDC的几个视频(2012年,2011年和2010年); 他们都有关于如何微调性能的很好的信息.

如果我说的话没什么意义,请随时提出任何问题.