UIView self.layer.shouldRasterize = YES和性能问题

时间:2012-07-17 11:55:44

标签: performance ios5 caemitterlayer

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

我有一个UIView类层次结构,self.layer.shouldRasterize已转为 ON ,以提高滚动效果(所有这些层次结构的STATIC子视图都大于设备屏幕)。

今天在其中一个子类中,我使用CAEmitterLayer来产生漂亮的粒子效果。

性能非常差虽然粒子的数量确实低(50粒子)

这个问题的原因是什么?

2 个答案:

答案 0 :(得分:34)

我将引用Apple Doc并解释:

@property BOOL shouldRasterize
  

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

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

  • 你什么时候可以从中受益?

当你只需画一次。这意味着当你需要纯粹的“简单”动画(例如移动,变换,缩放......)时,因为CoreAnimation实际上将使用该层而不是每帧重绘它。这是一个非常强大的功能,可以将复杂的图层(阴影和角半径)与CoreAnimation结合使用。

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

当您的图层重新显示多次时,因为在已经生效的图形顶部,shouldRasterize将处理所有像素以缓存位图数据。

所以你应该问自己的真正问题是:“我在shouldRasterize上应用了哪一层?是的?重新绘制这一层的频率是多少?”

希望这很清楚。

答案 1 :(得分:10)

关闭self.layer.shouldRasterize可将性能提升至正常水平。

为什么?

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