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

Sum*_*mon 14 performance ios5 caemitterlayer

我想分享我self.layer.shouldRasterize = YES;在UIViews上使用旗帜的经验.

我有一个UIView类层次结构已经self.layer.shouldRasterize变成ON,以提高性能滚动(所有的人都静子视图是比设备的屏幕大).

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

业绩是真穷,虽然粒子的数目确实很低(50个).

这个问题的原因是什么?

apo*_*che 36

我将引用Apple Doc并解释:

@property BOOL shouldRasterize
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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

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

希望这很清楚.

  • 我会说最不喜欢光栅化UITableViewCell并不是一个好主意有两个原因:1.如果你使用重用标识符,在滚动期间会多次重绘tableview单元格(因此,shouldRasterize会对它进行更多惩罚) .2:你不会从中受益,因为UITableViewCell的动画很常见. (3认同)

Sum*_*mon 10

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

这是为什么?

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