美文网首页
离屏渲染

离屏渲染

作者: ZAREMYDREAM | 来源:发表于2020-07-07 14:42 被阅读0次

    1、什么是离屏渲染

    GPU的渲染操作主要由CoreAnimation中的Render Server模块负责。Render Server在渲染过程主要遵循“画家算法",将图像的子layer层一层一层进行渲染,并存入帧缓冲区。在显示时,从帧缓存区中依次取出并显示在画布上。


    在图像显示过程中,图像一层一层从帧缓冲区读出,在完成显示后会将其从缓冲区中移除。但是图像往往不是做这么简单的显示,有时还需要对图像进行裁剪等操作。但这些已经从帧缓冲区中移除,再要对其进行操作肯定是无法实现的。所以,为了解决这一问题,添加了离屏缓冲区(offScreen Buffer),每一层图像先分别进行裁剪,存入离屏缓冲区中,然后再将处理好的结果进行合成放入帧缓冲区中。这一操作叫做离屏渲染。

    2、什么适合会触发离屏渲染

    先来简单看看这段代码

        UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
        btn.frame = CGRectMake(100, 100, 100, 100);
        btn.backgroundColor = [UIColor yellowColor];
        btn.layer.cornerRadius = 50;
        btn.layer.masksToBounds = YES;
        [self.view addSubview:btn];
        
        UIButton *btn1 = [UIButton buttonWithType:UIButtonTypeCustom];
        btn1.frame = CGRectMake(100, 250, 100, 100);
        btn1.backgroundColor = [UIColor yellowColor];
        btn1.layer.cornerRadius = 50;
        btn1.layer.masksToBounds = YES;
        [btn1 setImage:[UIImage imageNamed:@"test"] forState:UIControlStateNormal];
        [self.view addSubview:btn1];
        
        UIImageView *imgV = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"test"]];
        imgV.frame = CGRectMake(100, 400, 100, 100);
        imgV.layer.cornerRadius = 50;
        imgV.layer.masksToBounds = YES;
        [self.view addSubview:imgV];
        
        UIImageView *imgV1 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"test"]];
        imgV1.frame = CGRectMake(100, 550, 100, 100);
        imgV1.layer.cornerRadius = 50;
        imgV1.layer.masksToBounds = YES;
        imgV1.backgroundColor = [UIColor redColor];
        [self.view addSubview:imgV1];
    

    要查看是否触发了离屏渲染,在Simulator的菜单栏中选择Debug->Color Off-Screen Rendered即可查看。


    运行截图

    可明显看出,btn1与imgV1发生了离屏渲染。经过对比可发现,btn与imgV只有一层layer,而只对这一层layer进行操作时不会发生离屏渲染.
    所以,在多图层时且进行裁剪会触发离屏渲染。

    其他常见的触发离屏渲染的操作:

    1、使用mask遮罩
    2、设置阴影
    3、设置组透明度
    4、采用光栅化(layer.shouldRasterize)
    5、绘制文字的layer(UILabel, CATextLayer, Core Text)

    相关文章

      网友评论

          本文标题:离屏渲染

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