iOS-GPU屏幕渲染

OpenGL中,GPU屏幕渲染有两种方式:On-Screen Rendering和Off-Screen Rendering。

介绍

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

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

代价

离屏渲染的代价主要包括两方面内容:

  • 创建新的缓冲区;
  • 上下文的切换。

离屏渲染的整个过程,需要多次切换上下文环境:先是从当前屏切换到离屏;等到离屏渲染结束并显示到屏幕后,又需要切换到当前屏幕。而上下文环境的切换是要付出很大代价的。

原理

当使用圆角,阴影,遮罩的时候,图层属性的混合体被不能直接在屏幕中绘制,需要屏幕外渲染,当主屏绘制完成后,再将离屏的内容转移至主屏上。

触发方式

离屏渲染的触发方式:

  • shouldRasterize(光栅化)
  • masks(遮罩)
  • shadows(阴影)
  • edge antialiasing(抗锯齿)
  • group opacity(不透明)

避免方式

可以通过直接生成圆角图,而不是设置CALayer的属性:

1
2
3
4
5
6
UIGraphicsBeginImageContextWithOptions(sizeToFit, NO, UIScreen.mainScreen.scale);
CGContextAddPath(UIGraphicsGetCurrentContext(), [UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:radius].CGPath);
CGContextClip(UIGraphicsGetCurrentContext());
[self drawInRect:rect];
UIImage *output = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();