【问题标题】:Does CALayer shouldRasterize propagate to all sublayers?CALayer shouldRasterize 是否传播到所有子层?
【发布时间】:2012-09-02 13:03:48
【问题描述】:

如果我在 CALayer 上设置 shouldRasterize = YES,如果我希望整个层次结构被展平以获得更好的动画性能,我是否还必须在每个子层上设置它?

我问是因为当我在根图层上设置 shouldRasterize = YES 并在 Instruments 中启用“颜色混合图层”时,所有子图层仍然存在并标记为混合。它不会压扁任何东西。

【问题讨论】:

    标签: iphone ios ipad core-animation calayer


    【解决方案1】:

    设置shouldRasterize 并不像您想象的那样。为了合成父视图的外观,无论是否光栅化,它必须检查子视图以查看它们是opaque 还是透明的。当子对象为opaque时,不需要混合。当它们是透明的时,视图需要与它们后面的任何东西(或层次结构中的更高层)混合。

    因此,shouldRasterize 不会影响您使用 Instruments 看到的绿色/红色。为了让所有东西都变成绿色,您需要不使用透明度并将所有子对象都设为opaque。有时,根据您的设计,仍然不可避免地会有红色区域。该工具可帮助您优化可能opaque 的工具,并减少 GPU 必须执行的混合量。

    编辑: 为了进一步解释,假设您有一个 UILabel 并且它位于照片的顶部。您只想看到文本而不是其背景颜色,因此将其backgroundColor 设置为清除,并将opaque 属性设置为NO。在仪器中,这将显示为红色。 GPU 必须在其背后的图像上混合这种透明度,执行两个绘制操作而不是一个。

    如果我们将opaque 设置为YES 并为其提供纯色背景色,则视图现在在仪器中显示为绿色,因为它不必将该视图与任何其他视图混合。

    因此,无论图层是否被光栅化,它仍然必须合成其子视图,因此shouldRasterize 对您在 Instruments 中看到的内容实际上没有任何影响。

    【讨论】:

    • 将 shouldRasterize 设置为 YES 会提高动画性能吗?
    • 这取决于您执行动画的方式。如果您在UIView 上使用动画方法,动画选项之一是允许视图的渲染内容以动画方式呈现。默认情况下这是关闭的,这意味着动画将拍摄视图的快照并对其进行动画处理。因此,在这种情况下,渲染不会真正受到影响。如果您使用 CAAnimations,您将通过设置 shouldRasterize 获得性能提升,因为动画只会对栅格化图层进行动画处理,而不要求它绘制动画循环的每一帧。
    • 这是一个很好的答案,但我仍然想知道原始问题的答案。尽管“颜色混合图层”是关于其他内容的,但 shouldRasterize 与“颜色命中绿色并错过红色”和“颜色离屏渲染的黄色”相关,它们都对调试动画性能很有用。但是怎么做呢?
    猜你喜欢
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多