CALayer是否应该增加传播到所有子图层?

Pro*_*ber 14 iphone core-animation calayer ipad ios

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

我问,因为当我在根层设置shouldRasterize = YES并在Instruments中启用"Color Blended Layers"时,所有子层仍然存在并标记为混合.它并没有让任何事情变得扁平化.

gda*_*vis 10

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

因此,shouldRasterize不会影响您使用仪器看到的绿色/红色.为了让一切都变绿,你需要不使用透明度并拥有所有的子对象opaque.有时根据您的设计,它仍然不可避免地有红色区域.该仪器是只是为了帮助您优化那些可能opaque减少混合GPU具有做的量.

编辑:为了进一步解释,假设你有一个UILabel坐在照片上面.您只想查看文本而不是其背景颜色,因此将其设置backgroundColor为clear,并将opaque属性设置为NO.在乐器中,现在显示为红色.GPU必须将此透明度混合在其后面的图像上,执行两次绘制操作而不是一次.

如果我们设置opaqueYES,给它一个坚实的背景颜色,视图现在会显示绿色的仪器,因为它没有融入与其他任何观点,看法.

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

  • 这取决于您执行动画的方式.如果您在`UIView`上使用动画方法,其中一个动画选项是允许视图的渲染内容为其动画.默认情况下,这是关闭的,这意味着动画将拍摄视图的快照并为其设置动画.所以在这种情况下渲染不会真正受到影响.如果你正在使用CAAnimations,你可以通过设置`shouldRasterize`来提高性能,因为动画只会为光栅化图层设置动画,而不是要求它绘制动画循环的每一帧. (2认同)