美文网首页
iOS离屏渲染知识总结

iOS离屏渲染知识总结

作者: 辣条少年J | 来源:发表于2017-11-06 11:23 被阅读0次

    离屏渲染是之在非当前屏幕缓冲区进行渲染,如果重写了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为什么会导致离屏渲染?

    相关文章

      网友评论

          本文标题:iOS离屏渲染知识总结

          本文链接:https://www.haomeiwen.com/subject/wjteuxtx.html