如果我在 CALayer 上设置 shouldRasterize = YES,如果我希望整个层次结构被展平以获得更好的动画性能,我是否也必须在每个子层上设置它?
我问是因为当我在我的根层上设置 shouldRasterize = YES 并在 Instruments 中启用“颜色混合层”时,所有子层仍然存在并标记为混合。它没有压扁任何东西。
最佳答案
设置 shouldRasterize
并不像您想象的那样。为了合成父 View 的外观,光栅化与否,它必须检查 subview 以查看它们是不透明
还是透明的。当子对象不透明
时,它们不需要混合。当它们是透明的时, View 需要与它们后面(或层次结构中更高)的任何内容混合。
因此,shouldRasterize
不会影响您使用 Instruments 看到的绿色/红色。为了让所有东西都变成绿色,您需要不使用透明度,并且让您的所有子对象都不透明
。根据您的设计,有时不可避免地仍然有红色区域。该工具可帮助您优化可能不透明
的对象,并减少 GPU 必须执行的混合量。
编辑:
为了进一步解释,假设您有一个 UILabel
并且它位于一张照片之上。您只想查看文本而不是其背景颜色,因此将其 backgroundColor
设置为清除,并将 opaque
属性设置为 NO。在仪器中,这现在将显示为红色。 GPU 必须将这种透明度混合到其背后的图像上,执行两次绘制操作而不是一次。
如果我们将 opaque
设置为 YES
并给它一个纯色背景, View 现在将在仪器中显示为绿色,因为它不必混合与任何其他 View 一起查看。
因此,无论图层是否被栅格化,它仍然必须合成其 subview ,因此 shouldRasterize
实际上对您在 Instruments 中看到的任何一种方式都没有影响。
关于iphone - CALayer shouldRasterize 传播到所有子层吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12338553/