15

我想分享我self.layer.shouldRasterize = YES;在 UIViews 上使用标志的经验。

我有一个UIViewself.layer.shouldRasterize打开的类层次结构以提高滚动性能(它们都具有大于设备屏幕的 STATIC 子视图)。

今天在我用来CAEmitterLayer制作漂亮粒子效果的一个子类中。

尽管粒子数非常低(50 个粒子) ,但性能确实很差

这个问题的原因是什么?

4

2 回答 2

38

我将引用 Apple Doc 并解释:

@property BOOL shouldRasterize

当此属性的值为 YES 时,图层在其本地坐标空间中呈现为位图,然后与任何其他内容合成到目的地。阴影效果和滤镜属性中的任何滤镜都被光栅化并包含在位图中。但是,图层的当前不透明度未栅格化。如果光栅化位图在合成过程中需要缩放,则根据需要应用 minificationFilter 和 magnificationFilter 属性中的过滤器。

所以基本上当 shouldRasterize 设置为 YES 时,将计算构成图层的每个像素,并将整个图层缓存为位图。

  • 你什么时候能从中受益?

当您只需要绘制一次时。这意味着当您只需要纯粹的“简单”动画(例如移动、变换、缩放...)时,因为 CoreAnimation 实际上会使用该层,而无需在每一帧都重新绘制它。结合 CoreAnimation 缓存复杂图层(带有阴影和角半径)是一个非常强大的功能。

  • 它什么时候会杀死你的帧率?

当你的图层多次重新显示时,因为在已经生效的绘图之上,shouldRasterize会处理所有像素以缓存位图数据。

因此,您应该问自己的真正问题是:“我在哪一层上应用shouldRasterizeYES ?该层多久重绘一次?”

希望这已经足够清楚了。

于 2012-07-17T12:35:26.063 回答
11

关闭 self.layer.shouldRasterize 将性能提高到正常水平。

这是为什么?

根据苹果开发者网站上的视频(我不记得视频了,请帮忙?) self.layer.shouldRasterize 的规则很简单:如果您的所有子视图都是静态的(它们的位置、内容等,没有改变或动画) 然后将 self.layer.shouldRasterize 打开是受益者。另一方面,如果任何子视图发生变化,那么框架需要重新缓存视图层次结构,这是一个巨大的瓶颈。在底层,瓶颈是 CPU 和 GPU 之间的内存复制。

于 2012-07-17T12:04:00.187 回答