仪器用户指南有这样的说法:
- 彩色复制图像。将青色覆盖在由核心动画复制的图像上。
但这并不能解释为什么图像被复制。从一张复制的图像到另一张复制的图像似乎没有明显的模式,尽管它是规则的且可复制的。
文档目前甚至没有提到颜色命中绿色并错过红色,但我认为这可能与
CALayer
的shouldRasterize
属性有关。
有什么想法吗?
对于 “彩色复制图像”,这在 WWDC 2014 年第 419 场会议中得到了很好的讨论:
“如果图像是 GPU 无法直接处理的颜色格式,它将在 CPU 中进行转换。”
示例: 想象一下从在线来源获取图像,而您无法控制格式。 JPEG 支持 24 位彩色图像(每种颜色 8 位)。 TIFF 格式可以以 48 位彩色图像存储颜色(每种颜色 16 位)。根据 iOS 的需求,这些差异可能需要进行转换。
解决方案是将它们在后台转换为正确的颜色格式,以防止在主线程上进行这些转换时出现性能问题。
对于“Color Hits Green and Misses Red”,OP是正确的,它是检查您是否正确使用“shouldRasterize”属性。绿色表示良好,您重新使用了从“shouldRasterize”属性创建的缓存。红色表示不好,您需要写入缓存(导致屏幕外传递),然后绘制。
如果图像由自定义数据提供程序支持,或者由于某些其他原因无法映射到另一个进程,则可以复制图像。
使用 Core Animation Instruments 调试 iOS 渲染
好的做法是:
Real device -> Profile -> Core Animation FPS
核心动画工具(模拟器 -> 调试)
1。
Color Blended Layers
(overdraw
,混色)[绿、红]
在单个渲染帧中多次绘制相同像素
如果是红色 - 应用颜色混合。当像素下方有 alpha 通道时,计算正确的结果像素颜色并不是一件简单的任务。
使用案例:
UIView.layer.cornerRadius
应用颜色混合。这意味着应用了 alpha 的额外层要解决此问题,您可以:
-使用面膜(
Color Off-screen Rendered
将被应用)UILableView
- 背景颜色是透明的UIImage
带 alpha 通道(可在 UIImageView
中使用)防止颜色混合:
2。
Color Copied Images
[蓝色,默认]
如果是蓝色 - 图像从 GPU 复制到 CPU,因为 GPU 不支持这种颜色格式。例如,您可以创建一个大图像视图并设置
.pdf
image
imageView.image = UIImage(named: "ring")
3.
Color Misaligned Images
[黄色,默认]
图像大小不等于imageView大小。因为它需要额外的工作来压缩图像
4。
Color Off-screen Rendered
[黄色,默认]
如果黄色 - 图层在屏幕外渲染。例如
mask
、shadow **without** path
、cornerRadius
、使用 CGContext 自定义的内容、drawRect
真实设备另外有:
Xcode(13.3.1) -> Debug -> View Debugging -> Rendering
5。
Color Hits Green and Misses Red
[绿色、红色、默认]
表明
shouldRasterize = true
有负面影响。绿色 - 缓存成功,红色 - 缓存已重新生成。只有频繁再生才会对性能产生影响。
6。
Color Layer Formats
(彩色非标准表面格式)
没有记录
7。
Color Immediately
默认情况下,
Core Animation Instruments
每 10 毫秒更新一次调试颜色。此设置将其设置为更新每一帧,这对性能和准确性有一些影响。
8,
Color Compositing Fast-Path Blue
(颜色OpenGL Fast Path蓝色)[蓝色,红色,默认]
使用 OpenGL 直接绘制到屏幕的高亮(蓝色)层是最佳实践。如果您使用 OpenGL 并且看不到蓝色,则意味着您做了额外的工作
9。
Flash Updated Regions
[黄色,默认]
黄色是更新(重绘)的区域。最简单的场景就是发现不必要的影响