我写了一个iOS应用程序,我正在使用CGLayer
非常成功。在研究如何从这个应用程序中挤出更多性能时,我发现了这篇博文:http://iosptl.com/posts/cglayer-no-longer-recommended/,其中作者非常广泛地声明永远不会使用CGLayer
。单独一个人的职位不值得关注,但我也发现人们将这篇文章称为要遵守的内容。
没有提供真正的细节。例如,作者声称“有时它更快,有时它更慢”。这让我想知道,一般来说,程序员是否会正确使用这个对象。
我想这个问题适用于经验丰富的Cocoa / Cocoa Touch开发人员。这有什么好处吗? CGLayer
确实需要避免吗?如果有的话,是否存在具体的,可衡量的原因?
答案 0 :(得分:2)
首先回答我的问题,我想总结一下,您自己的设计决定是否在您的应用中使用CGLayer
。
真实的是,如果您在屏幕上绘制某些内容,它可能会在iOS平台上为您买不到任何东西。在iOS上,基本屏幕组成块是CALayer
。 CALayer
使用Quartz(CG)图形上下文在屏幕上绘制,这可能是由CGLayer
本身创建的上下文。现在,CALayer
本身就是硬件加速,会尝试将任何图形内容缓存到图形卡并重用它们。这就是我们之前使用CGLayer
的目的。
此外,如果涉及屏幕外渲染,CALayer
可以在shouldRasterize
设置为YES
时和其他情况下执行此操作。但是,请记住,在将呈现的内容移交给GPU之前,屏幕外组合也是CPU执行的另一项任务。所以再没有明显的赢家。
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
可能是也可能不是您程序的最佳缓存实现。