OpenGL--iOS离屏渲染篇

1,114 阅读2分钟

什么是离屏渲染?

正常渲染的流程

  • 正常的渲染是把数据丢给帧缓冲区然后显示到屏幕上。这个过程本着用完丢弃的原则,不做任何的存储。这样会提高性能。 如图:

离屏渲染的流程

  • 离屏渲染是我们将图片数据进行合并整合后进行圆角或裁减等操作。最后在显示到屏幕上,但是正常的渲染流程不会做任何的存储,所以我们需要离屏缓冲区,先把数据放到离屏缓冲区,处理好的结果给到帧缓冲区。如图(图画的不好,懂我意思就可以了。。🤣):

离屏渲染的优缺点

离屏渲染的缺点

  • 会影响性能:由于离屏缓冲区是额外开辟的存储数据的空间,将数据传到帧缓冲区多出一步转存的操作。
  • 离屏缓冲区有空间上线:是屏幕像素的2.5倍。

离屏渲染的必要性

那么为什么离屏渲染会造成性能问题,我们还会使用呢?

  • 处理一些特殊的效果:需要使用额外的off-screen Buffer保存中间状态,我们不得不使用。这种情况大多数是系统触发的。圆角、阴影等等
  • 效率优势:如果一个效果可以多次实现,可以提前渲染,达到复用的目的。

圆⻆角触发的离屏渲染 offscreen Rendering

来一波图文说明(由于绘画技术有限,偷一波图)。。

  • CALayer的构成有三部分,backgroundColor、contents、border。
  • 大家设置圆角的时候时候都会来一波裁减。觉得这是规律了。真正的原因是,当开发者设置圆角cornerRadius时只会对backgroundColor和border设置圆角,但是contents容却不会,如果要设置contents圆角的话就要使用maskToBounds、clipsToBounds。这样就会触发离屏渲染。

注:并不是所有的圆角都会触发离屏渲染,必须满足,backgroundColor、contents、border同时圆角操作。

常见的几种触发离屏渲染的情况。

  • 使用了 mask 的 layer (layer.mask)
  • 需要进行裁剪的 layer (layer.masksToBounds / view.clipsToBounds)
  • 设置了组透明度为 YES,并且透明度不为 1 的 layer (layer.allowsGroupOpacity/ layer.opacity)
  • 添加了投影的 layer (layer.shadow*)
  • 采用了光栅化的 layer (layer.shouldRasterize)
  • 绘制了文字的 layer (UILabel, CATextLayer, Core Text 等)