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)
网友评论