美文网首页
离屏渲染触发原理及处理

离屏渲染触发原理及处理

作者: _涼城 | 来源:发表于2020-07-18 13:02 被阅读0次

离屏渲染触发的原理

离屏渲染检测案例

先实现下面4个圆角Demo,分别为2个UIButton和2个UIImageVIew进行测试,我们可以发现圆角DemoA与圆角DemoC会发现离屏渲染,那是什么原因导致的离屏渲染呢?

  1. 圆角DemoA

     //1.按钮存在背景图片
       UIButton *btn1 = [UIButton buttonWithType:UIButtonTypeCustom];
       btn1.frame = CGRectMake(100, 30, 100, 100);
       btn1.layer.cornerRadius = 50;
       [btn1 setImage:[UIImage imageNamed:@"btn.png"] forState:UIControlStateNormal];
       btn1.clipsToBounds = YES;
       [self.view addSubview:btn1];
    
  2. 圆角DemoB

    //2.按钮不存在背景图片
       UIButton *btn2 = [UIButton buttonWithType:UIButtonTypeCustom];
       btn2.frame = CGRectMake(100, 180, 100, 100);
       btn2.layer.cornerRadius = 50;
       btn2.backgroundColor = [UIColor blueColor];
       [self.view addSubview:btn2];
       btn2.clipsToBounds = YES;
    
  3. 圆角DemoC

    //3.UIImageView 设置了图片+背景色;
       UIImageView *img1 = [[UIImageView alloc]init];
       img1.frame = CGRectMake(100, 320, 100, 100);
       img1.backgroundColor = [UIColor blueColor];
       [self.view addSubview:img1];
       img1.layer.cornerRadius = 50;
       img1.layer.masksToBounds = YES;
       img1.image = [UIImage imageNamed:@"btn.png"];
    
  4. 圆角DemoD

    //4.UIImageView 只设置了图片,无背景色;
       UIImageView *img2 = [[UIImageView alloc]init];
       img2.frame = CGRectMake(100, 480, 100, 100);
       [self.view addSubview:img2];
       img2.layer.cornerRadius = 50;
       img2.layer.masksToBounds = YES;
       img2.image = [UIImage imageNamed:@"btn.png"];
    
Offscreen Rendering (离屏渲染)渲染流程
iOS 正常渲染流程
正常渲染流程.jpg
离屏渲染流程
离屏渲染流程.jpg
离屏渲染造成的性能问题
  1. 离屏渲染的(离屏缓存区)会造成额外的存储空间(最大是屏幕像素区域的2.5倍)

  2. 离屏渲染帧缓存区到帧缓存区会造成额外的时间开销

为什么要使用离屏渲染的原因
  1. 特殊的效果不能一次完成渲染,需要使用额外的offscreen Buffer 保存中间的状态,不得不使用离屏渲染。

  2. 虽然造成了性能的消耗,但是提高了效率,达到了复用的目的。

几种造成离屏渲染的情况
遮罩渲染
遮罩渲染.png
高斯模糊渲染
毛玻璃渲染.png
开启光栅化(shouldRasterize)
光栅化.png

光栅化使用建议

  • 如果layer不能被复用,则没有必要打开光栅化

  • 如果layer不是静态的,开启离屏渲染反而没有效率

  • 离屏渲染缓存空间有限,2.5倍屏幕像素大小

  • 离屏渲染缓存内容有时间限制,100ms

圆角触发的离屏渲染
Layer的圆角.png

应用cornerRadiusmasksToBounds进行圆角+裁剪设置背景颜色和内容会造成离屏渲染,因为需要对多个图层进行圆角设置缓存在offscreenBuffer,进行组合渲染。

关于圆角的处理方案
  1. UIImageView 仅设置ImagecornerRadiusmaskToBounds

  2. 贝塞尔曲线绘制

  3. 圆角图片遮罩

  4. YYImage圆角处理

常见触发离屏渲染的情况
  1. 使用了mask的layer,layer.mask

  2. 需要裁剪的layer,layer.masksToBounds

  3. 设置组透明度,并且透明度不为1,layer.allowsGroupOpacity / layer.opacity

  4. 添加了投影的layer,layer.shadow

  5. 采用了光栅化的layer,layer.shouldRasterize

  6. 绘制了文字的layer

相关文章

  • 离屏渲染触发原理及处理

    离屏渲染触发的原理 离屏渲染检测案例 先实现下面4个圆角Demo,分别为2个UIButton和2个UIImageV...

  • 离屏渲染,OpenGL的三种渲染方式

    一. 离屏渲染触发的原理:APP在对图片进行渲染,合并的时候会触发离屏渲染,离屏渲染流程先把图层保存在帧缓冲区(o...

  • 四、iOS离屏渲染

    一、开启图层是否触发离屏渲染问题 注:离屏渲染的图层会标记为黄色 二、离屏渲染的渲染流程 三、离屏渲染触发的原因 ...

  • 离屏渲染的原理和分析

    1.常见触发离屏渲染的情况 在分析离屏渲染的原因之前先介绍几种常见的触发离屏渲染的情况 使⽤了 mask (遮罩...

  • iOS性能优化之图片圆角

    在Apple官方文档中多次提出开发时,避免触发离屏渲染效果.离屏渲染触发的情况有很多种,具体可参考iOS离屏渲染相...

  • 关于离屏渲染

    1.什么是离屏渲染 2.离屏渲染的触发方式 3.离屏渲染的意义 4.离屏渲染的不足 1.什么是离屏渲染 要了解离屏...

  • iOS 设置圆角会造成离屏渲染,你真的弄明白了吗?

    1. 如何设置圆角才会触发离屏渲染 我们经常看到,圆角会触发离屏渲染。但其实这个说法是不准确的,因为圆角触发离屏渲...

  • 离屏渲染触发原理简述

    数据的加载渲染流程有两种:1、正常渲染加载2、离屏渲染加载图1 可得:离屏渲染比正常渲染多一个离屏缓存区 一、正常...

  • 离屏渲染引发的反思

    经常看到说是离屏渲染会影响性能,我们要避免离屏渲染,然后阐述离屏渲染的触发情况有哪些? 既然离屏渲染那么不好,那为...

  • iOS离屏渲染解析

    离屏渲染 我们都知道一般情况下离屏渲染是犹豫设置了圆角触发的。触发离屏渲染真的只需要设置圆角么?下来我们通过案例分...

网友评论

      本文标题:离屏渲染触发原理及处理

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