gpt4 book ai didi

ios - -[CALayer setNeedsDisplayInRect :] causes the whole layer to be redrawn

转载 作者:可可西里 更新时间:2023-11-01 03:11:53 29 4
gpt4 key购买 nike

我将 CALayer 子类化以提供我自己的绘图方法。为了优化,我调用了 -[MyLayer setNeedsDisplayInRect:] 而不是 -[MyLayer setNeedsDisplay]。在绘图方法中,我得到了应该通过 CGContextGetClipBoundingBox() 重绘的矩形。

如果我将此层用作 UIView 的基础层,一切都会按预期进行。一旦我将自定义层用作其他 CALayer 的子层,问题就出现了。比 CGContextGetClipBoundingBox() 总是返回该层边界的矩形。

有什么想法吗?

[编辑]

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

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

最佳答案

不幸的是,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 and Misses Red 框来检查您在 Instruments 中的表现。如果您看到很多红色,很可能是使用 shouldRasterize 弊大于利。
  • 甚至比 shouldRasterize 更好的方法是展平您的图层层次结构,因为这样您就可以避免 shouldRasterize 在实时展平图层层次结构时产生的额外开销。当然这并不总是可能的,但不要害怕尝试 :)
  • 如果您正在绘制图像,请尝试使用您的 blending mode 进行试验.如果您碰巧要绘制不透明的图像,则无需使用普通的 source over 方法(它们都使用读/写带宽)。试试 kCGBlendModeCopy,它可以让您消除读取带宽开销。
  • 查看 CGLayerRef,它允许您在对绘图方法的各种调用中缓存 Core Graphics 输出。我的经验是,除非你正在做一些硬核像素插入,否则这最终会比重绘成本更高。参见 this阅读有趣。
  • 最重要的是,Instruments 是您的 friend 。查看过去 WWDC 的几个视频 ( 2012, 2011, and 2010 );他们都有关于如何微调性能的重要信息。

如果我说的话没有什么意义,请随时提出任何进一步的问题。

关于ios - -[CALayer setNeedsDisplayInRect :] causes the whole layer to be redrawn,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9809306/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com