我想分享我在UIViews上使用self.layer.shouldRasterize = YES;
标志的经验。
我有一个UIView
类层次结构,self.layer.shouldRasterize
已转为 ON ,以提高滚动效果(所有这些层次结构的STATIC子视图都大于设备屏幕)。
今天在其中一个子类中,我使用CAEmitterLayer
来产生漂亮的粒子效果。
性能非常差虽然粒子的数量确实低(50粒子)。
这个问题的原因是什么?
答案 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之间的内存复制。