什么会触发Instruments中的“颜色复制图像”和“命中绿色、未命中红色”?

27
Instruments用户指南中提到:

  • 颜色复制的图像。 在被核心动画复制的图像上放置青色叠加层。

但这并没有解释为什么一个图像会被复制。从一个被复制的图像到另一个被复制的图像似乎没有明显的模式,尽管这是规律和可重复的。

目前的文档甚至没有提到Color Hits Green and Misses Red,但我认为它可能与CALayershouldRasterize属性有关。

有任何想法吗?

3个回答

15
对于"颜色复制图像",在2014 WWDC的419会话中对此进行了很好的讨论:
"If an image is in a color format that the GPU can not directly work with, it will be converted in the CPU."
举个例子:假设从一个在线来源获取图像,你无法控制格式。 JPEG支持24位颜色图像(每个颜色8位)。 TIFF格式可以在48位颜色图像中存储颜色(每个颜色16位)。 根据iOS的要求,这些差异可能必须转换。
解决方案是在后台将它们转换为正确的颜色格式,以避免在主线程上执行这些转换时出现性能问题。
对于"颜色命中绿色和未命中红色", OP是正确的,它是用来检查你是否正确使用"shouldRasterize"属性。 绿色意味着好,你重复使用了从"shouldRasterize"属性创建的缓存。 红色意味着坏,你需要写入缓存(导致离屏通过),然后绘制。

3

如果图像由自定义数据提供者支持或无法映射到另一个进程中,那么它们可以被复制。


操作系统为什么会将应用特定的图形映射到另一个进程中? - Wilbur Vandrsmith
2
SpringBoard(iOS 5之前)/ BackBoard(iOS 6+)进程处理所有iOS应用程序的渲染。请参见WWDC 2012的第238个会话,他们在3分钟内解释了渲染步骤。 - ndfred

1

iOS调试核心动画工具

[iOS CALayer]

良好的实践是:

  • 60 FPS(每秒帧数) 真机 -> 概要 -> 核心动画 FPS
  • 测试发布包,因为某些编译优化

核心动画工具

模拟器 -> 调试:

  • 颜色混合图层(过度绘制, 颜色混合) [绿色, 红色]

单个渲染帧中,同一像素被绘制多次

如果是红色,则应用颜色混合。当有像素带有alpha通道时,计算正确的结果像素颜色并不是一项简单的任务。

[iOS alpha vs opacity vs opaque]

使用案例:

  1. UIView.layer.cornerRadius 应用颜色混合。这意味着额外的带有alpha的图层被应用

要解决此问题,您可以:

-使用遮罩(关闭离屏渲染的颜色将被应用)
-添加带有圆角的额外图层

  1. UILableView - 背景颜色是透明的
  2. UIImage 带有alpha通道(可在 UIImageView 中使用)

为了避免颜色混合: -平面视图层次结构
-减少透明度

  • 复制的颜色图片 [蓝色, 默认]

如果是蓝色,则从GPU复制图像到CPU,因为GPU不支持此颜色格式。例如,您可以创建一个大的imageview并设置 .pdf 图像。

imageView.image = UIImage(named: "ring")
  • 颜色不对齐的图像 [黄色,默认]

图像大小与imageView大小不相等。由于需要额外的工作来压缩图像。

  • 离屏渲染的颜色不正确 [黄色,默认]

如果是黄色-层被离屏渲染。例如maskshadow **without** pathcornerRadius,使用CGContext进行自定义绘制,drawRect等。

真实设备另外还有:

Xcode(13.3.1) -> Debug -> View Debugging -> Rendering

  • 命中绿色和未命中红色的颜色 [绿色,红色,默认]

显示shouldRasterize = true会产生负面影响。绿色-成功缓存,红色-缓存重新生成。只有频繁的再生成才会影响性能。

[iOS shouldRasterize]

  • 图层格式的颜色(非标准表面格式的颜色) 未记录
  • 立即着色

默认情况下,Core Animation Instruments每10毫秒更新一次调试有颜色的图层。此设置将其设置为每帧更新,这对性能和准确性有一定影响。

  • 复合快速路径蓝色(颜色OpenGL快速路径蓝色) [蓝色,红色,默认]

用OpenGL直接绘制在屏幕上的图层会被突出显示(蓝色),这是最佳实践。如果您使用OpenGL并且看不到蓝色,则意味着您正在进行额外的工作。

  • 闪存更新区域 [黄色,默认]

黄色是更新(重绘)的区域。最简单的场景是查找不必要的效果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接