首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >-[CALayer setNeedsDisplayInRect:]使整个层重新绘制

-[CALayer setNeedsDisplayInRect:]使整个层重新绘制
EN

Stack Overflow用户
提问于 2012-03-21 16:58:42
回答 1查看 2.3K关注 0票数 9

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

如果我使用这个层作为UIView的基本层,那么每一件事情都会像预期的那样工作。一旦我将我的自定义层用作另一个CALayer的子层,问题就会出现。而不是CGContextGetClipBoundingBox(),总是返回该层边界的rect。

有什么想法吗?

编辑

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

现在,我将呈现给图像上下文,并将该图像作为缓存保存。在绘图方法中,我只显示缓存的图像。

EN

回答 1

Stack Overflow用户

发布于 2012-10-25 04:12:21

令人遗憾的是,苹果的文档是矛盾的,因为-setNeedsDisplayInRect上的文档并不表示该方法在实践中是否有效。根据我自己的经验,这个technote澄清了这一点:

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

话虽如此,如果你认为你因为多余的绘画而撞上了一堵墙,你可以观察很多事情。

  • 如果绘制图像,您所能做的最大的性能改进就是使用与绘制相同尺寸的图像。如果它们不是,请尝试通过将图像呈现到屏幕外位图上下文中来缓存图像,并在稍后将其带回来。
  • 查看shouldRasterize属性在CALayer上。如果您试图操作一个子层可能构成复杂层层次结构的层,这可能是天赐之物。一定要通过在核心动画工具中勾选Color Hits Green and Misses Red框来检查你在乐器方面的表现。如果你看到很多红色的东西,那么使用shouldRasterize的几率比它所起的作用更大。
  • 甚至比shouldRasterize更好的是平平您的层层次结构,因为这样您就可以避免shouldRasterize在实时平整您的层层次结构时所带来的额外开销。当然,这并不总是可能的,但不要害怕尝试:)
  • 如果您正在绘制图像,请尝试使用您的混合模式进行实验。如果您正在绘制不透明的图像,则不需要在方法上使用正常的源(这些方法同时使用读/写带宽)。尝试kCGBlendModeCopy,它允许您消除读取带宽开销。
  • 查看CGLayerRef,它允许您通过对绘图方法的各种调用来缓存Core输出。我的经验是,除非你做一些硬核心像素推进,这最终比仅仅重绘要花费更多。有关有趣的阅读,请参阅
  • 最重要的是乐器是你的朋友。看看来自过去的WWDC(2012年、2011年和2010年)的几个视频,他们都有很好的信息,如何微调性能。

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9809306

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档