iOS离屏渲染知识总结
离屏渲染是之在非当前屏幕缓冲区进行渲染,如果重写了drawRect并使用了Core Graphics进行了绘制操作就涉及到了cpu渲染,渲染得到的bitmap由GPU用于显示。
CoreGraphics通常是线程安全的,所以可以进行异步绘制
通常,GPU 的渲染性能要比 CPU 高效很多,同时对系统的负载和消耗也更低一些。
CPU离屏渲染:core graphics是cpu渲染
GPU离屏渲染:需要开辟新的缓冲区渲染,绘制的时候需要上下文切换。
CALayer直接添加阴影会导致离屏渲染,但是添加阴影路径不会。离屏渲染直接结果有可能导致fps较低(fps越高越会得到流畅逼真的动画)。
GPU渲染机制:
CPU 计算好显示内容提交到 GPU,GPU 渲染完成后将渲染结果放入帧缓冲区,随后视频控制器会按照 VSync 信号逐行读取帧缓冲区的数据,经过可能的数模转换传递给显示器显示。
添加阴影:
方式一:直接添加(导致离屏渲染)
`
imgView.layer.shadowColor = [UIColor blackColor].CGColor;
imgView.layer.shadowOpacity = 0.8f;
imgView.layer.shadowRadius = 4.f;
imgView.layer.shadowOffset = CGSizeMake(4,4);
`
方式二:路径
//路径阴影
UIBezierPath *path = [UIBezierPath bezierPath];
[path moveToPoint:CGPointMake(-5, -5)];
//添加直线
[path addLineToPoint:CGPointMake(paintingWidth /2, -15)];
[path addLineToPoint:CGPointMake(paintingWidth +5, -5)];
[path addLineToPoint:CGPointMake(paintingWidth +15, paintingHeight /2)];
[path addLineToPoint:CGPointMake(paintingWidth +5, paintingHeight +5)];
[path addLineToPoint:CGPointMake(paintingWidth /2, paintingHeight +15)];
[path addLineToPoint:CGPointMake(-5, paintingHeight +5)];
[path addLineToPoint:CGPointMake(-15, paintingHeight /2)];
[path addLineToPoint:CGPointMake(-5, -5)];
//设置阴影路径
imgView.layer.shadowPath = path.CGPath;
设置圆角:
方式一:(直接设置,导致离屏渲染)
aView.layer.cornerRadius=8;
aView.layer.masksToBounds=YES;
方式二:(设置路径,不会导致离屏渲染)
//设置所需的圆角位置以及大小UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:aView.bounds byRoundingCorners:UIRectCornerBottomLeft | UIRectCornerBottomRight cornerRadii:CGSizeMake(10,10)];
CAShapeLayer*maskLayer =[[CAShapeLayer alloc] init];
maskLayer.frame=aView.bounds;
maskLayer.path=maskPath.CGPath;
aView.layer.mask= maskLayer;
概念:
光栅化概念:将图转为为一个个栅格组成的图像
光栅化特点:每个元素对应帧缓冲区中的一像素
当属性是YES的时候,会生成位图并且和其他内容合成,当为False的时候是直接生成。
shouldRasterize = YES
光栅化会导致离屏渲染,但是同时也会将渲染的图片缓存,提高性能。因为缓存,光栅化对层级复杂的视图或者有复杂特效效果的图层性能提升明显。
如果图层内容经常变化,缓存就会无效,这个时候离屏渲染会降低性能。
相当于光栅化是把GPU的操作转到CPU上了,生成位图缓存,直接读取复用。
问题:
drawrect为什么会导致离屏渲染?