ios – – [CALayer setNeedsDisplayInRect:]导致整个图层被重绘

我正在继承CALayer以提供我自己的方法绘图.为了优化,我调用 – [MyLayer setNeedsdisplayInRect:]而不是 – [MyLayer setNeedsdisplay].在绘图方法中,我得到了应该通过CGContextGetClipBoundingBox()重绘的矩形.

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

有任何想法吗?

[编辑]

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

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

解决方法

不幸的是,Apple的文档存在冲突,因为-setNeedsdisplayInRect上的文档没有指出该方法是否在实践中有效.根据我自己的经验,this technote直截了当:

Note that,because of the way that iPhone/iPod touch/iPad updates its screen,the entire view will be redrawn if you call -setNeedsdisplayInRect: or -setNeedsdisplay:.

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

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

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

相关文章

当我们远离最新的 iOS 16 更新版本时,我们听到了困扰 Apple...
欧版/美版 特别说一下,美版选错了 可能会永久丧失4G,不过只...
一般在接外包的时候, 通常第三方需要安装你的app进行测...
前言为了让更多的人永远记住12月13日,各大厂都在这一天将应...