什么会触发仪器中的“彩色复制图像”和“颜色达到绿色并错过红色”?

问题描述 投票:0回答:3

仪器用户指南有这样的说法:

  • 彩色复制图像。将青色覆盖在由核心动画复制的图像上。

但这并不能解释为什么图像被复制。从一张复制的图像到另一张复制的图像似乎没有明显的模式,尽管它是规则的且可复制的。

文档目前甚至没有提到颜色命中绿色并错过红色,但我认为这可能与

CALayer
shouldRasterize
属性有关。

有什么想法吗?

ios core-animation instruments
3个回答
15
投票

对于 彩色复制图像”,这在 WWDC 2014 年第 419 场会议中得到了很好的讨论:

“如果图像是 GPU 无法直接处理的颜色格式,它将在 CPU 中进行转换。”

示例: 想象一下从在线来源获取图像,而您无法控制格式。 JPEG 支持 24 位彩色图像(每种颜色 8 位)。 TIFF 格式可以以 48 位彩色图像存储颜色(每种颜色 16 位)。根据 iOS 的需求,这些差异可能需要进行转换。

解决方案是将它们在后台转换为正确的颜色格式,以防止在主线程上进行这些转换时出现性能问题。

对于“Color Hits Green and Misses Red”,OP是正确的,它是检查您是否正确使用“shouldRasterize”属性。绿色表示良好,您重新使用了从“shouldRasterize”属性创建的缓存。红色表示不好,您需要写入缓存(导致屏幕外传递),然后绘制。


3
投票

如果图像由自定义数据提供程序支持,或者由于某些其他原因无法映射到另一个进程,则可以复制图像。


1
投票

使用 Core Animation Instruments 调试 iOS 渲染

[iOS CALayer]

好的做法是:

  • 60 FPS(每秒帧数)
    Real device -> Profile -> Core Animation FPS
  • 测试发布包,因为一些编译优化

核心动画工具(模拟器 -> 调试)

1。

Color Blended Layers
overdraw
,混色)[绿、红]

单个渲染帧中多次绘制相同像素

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

[iOS Alpha vs 不透明度 vs 不透明]

使用案例:

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

要解决此问题,您可以:

-使用面膜(

Color Off-screen Rendered
将被应用)
-添加带有圆角的额外层

  1. UILableView
    - 背景颜色是透明的
  2. 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
有负面影响。绿色 - 缓存成功,红色 - 缓存已重新生成。只有频繁再生才会对性能产生影响。

[iOS 应该光栅化]

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
[黄色,默认]

黄色是更新(重绘)的区域。最简单的场景就是发现不必要的影响

© www.soinside.com 2019 - 2024. All rights reserved.