何时应将layer.shouldRasterize设置为YES?

57

我曾经看到一些减少卡顿问题的方法,是通过设置视图的layer属性来实现的

view.layer.shouldRasterize = YES;

当使用UICollectionView并准备单元格并设置属性时,我发现性能有很大的差异。

不确定这意味着什么。

如果能解释一下就太好了。谢谢!

2个回答

73
在WWDC 2012的“Polishing Your Interface Rotations”视频中(遗憾的是,现在已不再在线),他们谈到了光栅化图层的优势和影响。
总之,如果您有一个复杂的视图(即重新渲染相对昂贵),您正在对其进行动画处理,但动画视图本身并没有改变,则光栅化图层可以通过不时重新渲染图层来提高性能。但这是以内存为代价的(在内存中保存光栅化图像)。
但是,如果您在图层内进行更改的动画,shouldRasterize会对性能产生不利影响(因为它将为每个动画帧重新光栅化图层)。
一般来说,如果要对一组复杂的图层进行动画处理,而这些图层本身并未发生变化,则可以将shouldRasterize设置为YES,执行动画处理,然后关闭shouldRasterize

1

iOS shouldRasterize

[iOS调试颜色命中绿色和未命中红色]

Rasterization = off-screen Rendered + off-screen buffer(cache)

shouldRasterize = true

优点 - 对于复杂的图层(包括子视图、子图层和其他效果),会发生移动(滚动等)。使用缓存而不是每次重新绘制它很简单。

缺点 - 不具有动态性。如果视图更改边界(宽度、高度、阴影、cornerRadius、颜色、内部内容等...),它会产生额外工作-缓存被重建频繁地重新生成缓存会对性能产生影响。

UIKit 预渲染视图离屏(子图层、子视图将被考虑在内,创建一个单一位图,之后所有其他效果(如不透明度、遮罩..)将被应用并保存(缓存)到RAM中(直到需要更新),当图层的位置改变时-UIKit 直接从RAM读取它(缓存的图层)(而不是从头开始渲染(这不是一项简单的任务,例如计算颜色混合层..))

它将焦点从GPU转移到RAM,这需要一些额外的工作,但在使用过程中能提高执行速度。

view1.layer.shouldRasterize = true
view1.layer.rasterizationScale = UIScreen.main.scale

另一个例子是在UITableView中使用shouldRasterize = true,当您有一个带有许多阴影等复杂视图+滚动时,它会导致性能下降,这就是为什么shouldRasterize = true有其存在的地方。在这里,您将看到单元格被缓存,但新单元格将被重新生成。
此外,请注意每个缓存都具有:
  • 大小
  • 过期属性。如果缓存未被使用,则可以将其删除

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