“CGLayer不再推荐”;这是普遍的共识吗?

时间:2014-02-12 20:29:56

标签: ios cocoa-touch cocoa core-graphics cglayer

我写了一个iOS应用程序,我正在使用CGLayer非常成功。在研究如何从这个应用程序中挤出更多性能时,我发现了这篇博文:http://iosptl.com/posts/cglayer-no-longer-recommended/,其中作者非常广泛地声明永远不会使用CGLayer。单独一个人的职位不值得关注,但我也发现人们将这篇文章称为要遵守的内容。

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

我想这个问题适用于经验丰富的Cocoa / Cocoa Touch开发人员。这有什么好处吗? CGLayer确实需要避免吗?如果有的话,是否存在具体的,可衡量的原因?

3 个答案:

答案 0 :(得分:2)

首先回答我的问题,我想总结一下,您自己的设计决定是否在您的应用中使用CGLayer

真实的是,如果您在屏幕上绘制某些内容,它可能会在iOS平台上为您买不到任何东西。在iOS上,基本屏幕组成块是CALayerCALayer使用Quartz(CG)图形上下文在屏幕上绘制,这可能是由CGLayer本身创建的上下文。现在,CALayer本身就是硬件加速,会尝试将任何图形内容缓存到图形卡并重用它们。这就是我们之前使用CGLayer的目的。

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

在创建不会在屏幕上绘制的CG上下文时,

CGLayer会特别方便。

我不确定为什么Apple开发团队要求其完全避免CGLayer。可能存在一些潜在的架构缺陷,但这是无证的,直到约会。但是,在我们确定并且我们已经在CGLayer架构上设计现有应用之前,我没有找到完全放弃它的任何具体原因。

答案 1 :(得分:2)

对我而言,最相关的一点是作者在其后续评论中所写的内容:

  

正如我从Core Graphics团队那里了解到的那样,他们基本上没有触及它[CGLayer],因为在iPhone出现之前。这听起来真的很好,但在实践中没有成功。但它实际上并没有被破坏,所以没有理由弃用它。正如我所提到的,如果你有很棒的CGLayer代码,我认为没有任何理由来替换它。 CGLayer不是它不像CG的其他部分一样维护。

如果Apple的Quartz 2D Programming Guide(2014年更新)没有包含以下突出的评论框,那将会很有帮助:

  

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

答案 2 :(得分:1)

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

CGLayer视为您计划的潜在优化。 CGLayer有可能以积极和消极的方式影响您的计划的绩效和资源消耗(在许多情况下需要权衡)。在摘要中,它很像一个缓存(它有自己的成本)。备用缓存机制有自己的相关成本,CGLayer可能是也可能不是您程序的最佳缓存实现。