Performance UIView self.layer.shouldRasterize=是和性能问题

Performance UIView self.layer.shouldRasterize=是和性能问题,performance,ios5,caemitterlayer,Performance,Ios5,Caemitterlayer,我想分享一下我使用self.layer.shouldRasterize=YES的经验标记 我有一个ui视图类层次结构,它有self.layer。应该将光栅化打开,以提高滚动性能(它们都有静态子视图,比设备的屏幕大) 今天在我使用的一个子类中,CAEmitterLayer产生了很好的粒子效果 性能非常差,尽管粒子数非常低(50个粒子) 此问题的原因是什么?关闭self.layer.shouldRasterize可将性能提高到正常水平 为什么呢 根据苹果开发者网站上的一段视频(我记不起视频了,请帮忙

我想分享一下我使用self.layer.shouldRasterize=YES的经验标记

我有一个
ui视图
类层次结构,它有
self.layer。应该将
光栅化打开,以提高滚动性能(它们都有静态子视图,比设备的屏幕大

今天在我使用的一个子类中,
CAEmitterLayer
产生了很好的粒子效果

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


此问题的原因是什么?

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

为什么呢


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

我将引用Apple Doc并解释:

@property BOOL shouldRasterize
当此特性的值为“是”时,图层为 在其局部坐标空间中渲染为位图,然后进行合成 与任何其他内容一起发送到目标。阴影效果和任何 过滤器属性中的过滤器被光栅化并包含在 位图。但是,层的当前不透明度未光栅化。 如果光栅化位图在合成期间需要缩放,则 缩小过滤器和放大过滤器属性中的过滤器 根据需要应用

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

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

  • 什么时候你会死
多次重新显示图层时,因为在已生效的图形顶部,
shouldRasterize
将处理所有像素以缓存位图数据

因此,您应该问自己的真正问题是:“我在哪一层上应用
shouldRasterize
来表示“是”?该层多长时间重新绘制一次?”


希望这足够清楚。

我是iOS新手。如果我将它用于自定义UITableViewCells,那么shouldRasterize=YES是否好?顺便说一句,谢谢你的回答。:)@apouchei可能会说,不,光栅化UITableViewCell不是一个好主意,原因有二:1。如果使用重用标识符,在滚动过程中,tableview单元格将被多次重绘(因此,shouldRasterize将进一步惩罚它)。2:您不会从中受益,因为为UITableViewCell设置动画是很少见的。@apouche等等,如果您进行缩放,您是说要使用shouldRasterize吗?这会不会不只是缩放位图缓存,然后导致一个难看的图像?(例如,放大比例?)