【问题标题】:"CGLayer no longer recommended"; Is this the general consensus?“不再推荐 CGLayer”;这是普遍共识吗?
【发布时间】:2014-03-11 10:14:04
【问题描述】:

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

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

我想这个问题是针对经验丰富的 Cocoa/Cocoa Touch 开发人员的。这有什么优点吗? CGLayer 是否确实需要避免,如果是,是否有具体的、可衡量的原因说明原因?

【问题讨论】:

  • 如果您已经编写了应用程序,那么您应该已经非常清楚它是否按您想要的方式工作了。这是唯一重要的测试。
  • 也就是说,如果您已经完成并且它对您有效,那么我认为没有问题。
  • 该帖子中的 cmets 也值得一读。它没有被弃用,也没有损坏,但值得查看页面底部的最后更新日期:developer.apple.com/library/ios/documentation/GraphicsImaging/… vs CALayer:developer.apple.com/library/ios/documentation/GraphicsImaging/…。随心所欲地接受它,一个人在 WWDC 上的传闻(和非官方)聊天,并玩弄 Instruments。
  • “我还发现有人认为这篇文章是值得遵守的。”因为它的作者是关于 iOS IMO 高级使用的最佳书籍的作者。他的 cmets 和意见和指导更重要,IMO,然后是一些随机的自封 iOS 博主。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    真正的情况是,如果你在屏幕上绘制东西,它在 iOS 平台上可能不会给你带来任何好处。在 iOS 上,基本的屏幕合成块是 CALayerCALayer 采用 Quartz(CG) 图形上下文在屏幕上绘制它,这可能是由 CGLayer 本身创建的上下文。现在,CALayer 本身是硬件加速的,它会尝试将任何图形内容缓存到图形卡并重复使用它们。这就是我们之前使用CGLayer 的目的。

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2015-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-19
        • 2011-01-25
        • 1970-01-01
        相关资源
        最近更新 更多