汽车装饰网站模板,策划公司怎么找客户,东莞小程序开发哪家好,烟台优化网站建设文章目录 离屏渲染UIView和CALayer关系GPU屏幕渲染有两种方式:产生离屏渲染的原因#xff1a;既然离屏渲染这么耗性能,为什么有这套机制呢?什么情况会离屏渲染#xff1f;既然离屏渲染这么不好#xff0c;为什么我们还要强制开启呢#xff1f;如何避免离屏渲染#xff1f… 文章目录 离屏渲染UIView和CALayer关系GPU屏幕渲染有两种方式:产生离屏渲染的原因既然离屏渲染这么耗性能,为什么有这套机制呢?什么情况会离屏渲染既然离屏渲染这么不好为什么我们还要强制开启呢如何避免离屏渲染1.圆角的优化2.shadow 离屏渲染
UIView和CALayer关系
UIView继承自UIResponder可以处理系统传递过来的事件如UIApplication、UIViewController、UIView以及所有从UIView派生出来的UIKit类。每个UIView内部都有一个CALayer提供内容的绘制和显示并且作为内部RootLayer的代理视图。CALayer继承自NSObject类负责显示UIView提供的内容contents。CALayer有三个视觉元素背景色、内容和边框其中内容的本质是一个CGImage。
GPU屏幕渲染有两种方式:
1.On-Screen Rendering (当前屏幕渲染) 指的是GPU的渲染操作是在当前用于显示的屏幕缓冲区进行。
2.Off-Screen Rendering (离屏渲染) 指的是在GPU在当前屏幕缓冲区以外开辟一个缓冲区进行渲染操作。
当前屏幕渲染不需要额外创建新的缓存也不需要开启新的上下文相对于离屏渲染性能更好。但是受当前屏幕渲染的局限因素限制(只有自身上下文、屏幕缓存有限等)当前屏幕渲染有些情况下的渲染解决不了的就使用到离屏渲染。
产生离屏渲染的原因
苹果系统不能够一次的去处理视图需要一张一张的去处理视图那么就会需要开辟一个离屏缓存区去存储一张张处理好的视图开辟的这个离屏缓存区就会导致离屏渲染。
既然离屏渲染这么耗性能,为什么有这套机制呢?
有些效果被认为不能直接呈现于屏幕而需要在别的地方做额外的处理预合成。图层属性的混合体没有预合成之前不能直接在屏幕中绘制所以就需要屏幕外渲染。
什么情况会离屏渲染
为图层设置遮罩layer.mask将图层的layer.masksToBounds / view.clipsToBounds属性设置为true将图层layer.allowsGroupOpacity属性设置为YES和layer.opacity小于1.0为图层设置阴影layer.shadow *。为图层设置光栅化 layer.shouldRasterizetrue具有layer.cornerRadiuslayer.edgeAntialiasingMasklayer.allowsEdgeAntialiasing的图层 当然也不是所有的圆角都会导致离屏渲染文本任何种类包括UILabelCATextLayerCore Text等。使用CGContext在drawRect :方法中绘制大部分情况下会导致离屏渲染甚至仅仅是一个空的实现。
既然离屏渲染这么不好为什么我们还要强制开启呢
当一个图像混合了多个图层每次移动时每一帧都要重新合成这些图层十分消耗性能。当我们开启光栅化后会在首次产生一个位图缓存当再次使用时候就会复用这个缓存。但是如果图层发生改变的时候就会重新产生位图缓存。所以这个功能一般不能用于 UITableViewCell中cell的复用反而降低了性能。最好用于图层较多的静态内容的图形。而且产生的位图缓存的大小是有限制的一般是2.5个屏幕尺寸。在100ms之内不使用这个缓存缓存也会被删除。所以我们要根据使用场景而定。
如何避免离屏渲染
1.圆角的优化
1使用贝塞尔曲线UIBezierPath和Core Graphics框架画出一个圆角 2、使用CAShapeLayer和UIBezierPath设置圆角 总的来说就是用CAShapeLayer的内存消耗少渲染速度快建议使用优化方案2。
2.shadow
对于shadow如果图层是个简单的几何图形或者圆角图形我们可以通过设置shadowPath来优化性能能大幅提高性能。示例如下
mageView.layer.shadowColor[UIColorgrayColor].CGColor;
imageView.layer.shadowOpacity1.0;
imageView.layer.shadowRadius2.0;
UIBezierPath *path[UIBezierPathbezierPathWithRect:imageView.frame];
imageView.layer.shadowPathpath.CGPath;我们还可以通过设置shouldRasterize属性值为YES来强制开启离屏渲染。其实就是光栅化Rasterization。