离屏渲染

离屏渲染

一、渲染机制

  • GPU渲染机制:

CPU 计算好显示内容提交到 GPU,GPU 渲染完成后将渲染结果放入帧缓冲区,随后视频控制器会按照 VSync 信号逐行读取帧缓冲区的数据,经过可能的数模转换传递给显示器显示。

  • GPU渲染的两种方式

On-Screen Rendering
意为当前屏幕渲染,指的是GPU的渲染操作是在当前用于显示的屏幕缓冲区中进行。

Off-Screen Rendering
意为离屏渲染,指的是GPU在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作。

二、离屏渲染的触发方式

1、shouldRasterize(光栅化)
其中shouldRasterize(光栅化)是比较特别的一种:
光栅化概念:将图转化为一个个栅格组成的图象。
光栅化特点:每个元素对应帧缓冲区中的一像素。

shouldRasterize = YES在其他属性触发离屏渲染的同时,会将光栅化后的内容缓存起来,如果对应的layer及其sublayers没有发生改变,在下一帧的时候可以直接复用。shouldRasterize = YES,这将隐式的创建一个位图,各种阴影遮罩等效果也会保存到位图中并缓存起来,从而减少渲染的频度(不是矢量图)。

相当于光栅化是把GPU的操作转到CPU上了,生成位图缓存,直接读取复用。

当你使用光栅化时,你可以开启“Color Hits Green and Misses Red”来检查该场景下光栅化操作是否是一个好的选择。绿色表示缓存被复用,红色表示缓存在被重复创建。

2、masks(遮罩)

代码:
UIView *bg = [[UIView alloc] initWithFrame:CGRectMake(15,100,451,120)];
bg.backgroundColor = UIColor.blueColor;

// Create a mask layer and the frame to determine what will be visible in the view.

CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
CGRect maskRect = CGRectMake(50, 50, 20, 20);

// Create a path and add the rectangle in it.

CGMutablePathRef path = CGPathCreateMutable();
CGPathAddRect(path, nil, maskRect);

// Set the path to the mask layer.
[maskLayer setPath:path];
// Release the path since it's not covered by ARC.

CGPathRelease(path);
// Set the mask of the view.
bg.layer.mask = maskLayer;
[self.view addSubview:bg];

3、shadows(阴影)

4、edge antialiasing(抗锯齿)

5、allowsGroupOpacity、opacity(不透明)

6、复杂形状设置圆角等

7、渐变

iOS 9.0 之前UIimageView跟UIButton设置圆角都会触发离屏渲染

iOS 9.0 之后UIButton设置圆角会触发离屏渲染,而UIImageView里png图片设置圆角不会触发离屏渲染了,如果设置其他阴影效果之类的还是会触发离屏渲染的。

你可能感兴趣的:(离屏渲染)