5

我编写了一个 iOS 应用程序,我在其中使用CGLayer得非常成功。在研究从这个应用程序中挤出更多性能的方法时,我看到了这篇博文:http: //iosptl.com/posts/cglayer-no-longer-recommended/,其中作者非常广泛地指出CGLayer永远不会使用。单独的帖子无需担心,但我也发现人们将这篇帖子称为要遵守的内容。

没有提供真正的细节。例如,作者说“有时更快,有时更慢”。这让我想知道是否担心程序员一般不会正确使用这个对象。

我想这个问题是针对经验丰富的 Cocoa/Cocoa Touch 开发人员的。这有什么优点吗?CGLayer确实是要避免的事情,如果是的话,是否有具体的、可衡量的理由来解释为什么?

4

3 回答 3

3

从我的回答开始,我想得出结论,无论您是否会CGLayer在您的应用程序中使用,这完全是您自己的设计决定。

实际情况是,如果你在屏幕上绘制东西,它可能不会在 iOS 平台上为你买任何东西。在 iOS 上,基本的屏幕合成块是CALayer. CALayer需要一个 Quartz(CG) 图形上下文在屏幕上绘制它,这可能是一个由CGLayer它自己创建的上下文。现在,CALayer本身是硬件加速,将尝试将任何图形内容缓存到图形卡并重复使用它们。这就是我们之前使用的目的CGLayer

此外,如果涉及到屏幕外渲染,则CALayer可以在shouldRasterize设置为时YES和在某些其他情况下执行此操作。但是,请记住,屏幕外合成是 CPU 在将渲染内容移交给 GPU 之前执行的另一项任务。所以同样没有明确的赢家。

CGLayer在创建不会在屏幕上绘制的 CG 上下文(如 PDF 上下文)时会特别方便。

我不确定为什么苹果开发团队要求CGLayer完全避免。可能存在一些潜在的架构缺陷,但迄今为止尚未记录。然而,在我们确定这一点并且我们已经拥有基于CGLayer架构设计的现有应用程序之前,我没有找到任何完全放弃它的具体理由。

于 2014-02-12T22:05:59.973 回答
3

对我来说,最相关的一点是作者在他的后续评论中写道:

据我从Core Graphics 团队了解到,他们在iPhone 出现之前基本上没有接触过它[CGLayer]。这是听起来非常好的事情之一,但在实践中并没有奏效。但它实际上并没有被破坏,所以没有理由弃用它。正如我所提到的,如果你有很棒的 CGLayer 代码,我看不出有任何替换它的理由。CGLayer 还不错它只是不像 CG 的其他部分那样维护。

如果 Apple 的Quartz 2D 编程指南(2014 年更新)不包含以下突出的注释框,将会很有帮助:

注意:位图图形上下文有时用于在屏幕外绘制。在您决定为此目的使用位图图形上下文之前,请参阅核心图形层绘图。CGLayer 对象 (CGLayerRef) 针对屏幕外绘图进行了优化,因为 Quartz 尽可能在视频卡上缓存图层。

于 2016-07-26T09:01:50.220 回答
1

不。请忽略博客中引用的“从不”,除非您从未分析过该影响CGLayer对您的应用程序的影响。

CGLayers 视为您的程序的潜在优化。CGLayers 有可能以正面和负面的方式影响程序的性能和资源消耗(在许多情况下是一种权衡)。抽象地说,它很像缓存(有自己的成本)。替代缓存机制有其自身的相关成本,并且CGLayer可能是也可能不是您的程序的最佳缓存实现。

于 2014-02-12T21:10:21.087 回答