如果我在 CALayer 上设置了 shouldRasterize = YES,如果我希望将整个层次结构展平以获得更好的动画性能,是否也必须在每个子层上设置它?
我问是因为当我在根图层上设置 shouldRasterize = YES 并在仪器中启用“颜色混合图层”时,所有子图层仍然存在并标记为混合。它没有使任何东西变平。
如果我在 CALayer 上设置了 shouldRasterize = YES,如果我希望将整个层次结构展平以获得更好的动画性能,是否也必须在每个子层上设置它?
我问是因为当我在根图层上设置 shouldRasterize = YES 并在仪器中启用“颜色混合图层”时,所有子图层仍然存在并标记为混合。它没有使任何东西变平。
设置shouldRasterize
并没有完全按照您的想法进行。为了合成父视图的外观,无论是否光栅化,它必须检查子视图以查看它们是否opaque
透明。当子对象是 时opaque
,它们不需要混合。当它们是透明的时,视图需要与它们后面的任何东西(或层次结构中的更高层)混合。
因此,shouldRasterize
不会影响您使用 Instruments 看到的绿色/红色。为了让所有东西都变成绿色,您需要不使用透明度并将所有子对象都设置为opaque
. 有时,根据您的设计,仍然不可避免地会有红色区域。该工具可帮助您优化可能opaque
的工具并减少 GPU 必须执行的混合量。
编辑:为了进一步解释,假设你有一个UILabel
和它坐在照片上。您只想看到文本而不是其背景颜色,因此将其设置backgroundColor
为 clear,并将opaque
属性设置为 NO。在仪器中,这将显示为红色。GPU 必须在其背后的图像上混合这种透明度,执行两个绘制操作而不是一个。
如果我们设置并opaque
给YES
它一个纯色的背景颜色,该视图现在将在仪器中显示为绿色,因为它不必将该视图与任何其他视图混合。
因此,无论图层是否被光栅化,它仍然必须合成其子视图,因此shouldRasterize
对于您在 Instruments 中看到的内容实际上没有任何影响。