iphone - CALayer shouldRasterize 传播到所有子层吗?

标签 iphone ios ipad core-animation calayer

如果我在 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/

相关文章:

android - Android 和 Iphone 之间的应用感知蓝牙 BLE 通信

iphone - 向 iPhone 中的 UIImage 添加类别

ios - 如何在 swift 5 中显示模态屏幕?

iphone - iOS 应用程序提交期间要求的 Bundle ID 域扩展

iphone - 如何将 plist 从 bundle 移动到 iOS 上的文档文件夹

ios - 自定义 segue 使用(第二个)iPad Storyboard崩溃

iphone - 因没有 Google Logo 而被拒绝 - mapkit - 但无法显示它

css - Iphone 上奇怪的背景图像和边框错误

ios - 在节点暂停的情况下开始场景

ios - UITableViewCellaccessoryType什么时候统一的?