OffScreenRendering - ShenYj/ShenYj.github.io GitHub Wiki

Off-Screen Rendering 离屏渲染

在 OpenGL 中,GPU 有2种渲染方式

  • On-Screen Rendering:当前屏幕渲染,在当前用于显示的屏幕缓冲区进行渲染操作
  • Off-Screen Rendering:离屏渲染,在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作

离屏渲染

离屏渲染就是在当前屏幕缓冲区以外,新开辟一个缓冲区进行操作

离屏渲染缓冲区的空间上限是屏幕像素点的2.5倍

离屏渲染消耗性能的原因

想要进行离屏渲染,首选要创建一个新的缓冲区,屏幕渲染会有一个上下文环境的一个概念,离屏渲染的整个过程需要切换上下文环境,先从当前屏幕切换到离屏,等结束后,又要将上下文环境切换回来。

这也是为什么会消耗性能的原因了。

CPU、GPU 在绘制渲染视图时做了大量的工作。离屏渲染发生在 GPU 层面上,会创建新的渲染缓冲区,会触发 OpenGL 的多通道渲染管线,图形上下文的切换会造成额外的开销,增加 GPU 工作量。如果 CPU GPU 累计耗时 16.67 毫秒还没有完成,就会造成卡顿掉帧

哪些操作会触发离屏渲染

  • 光栅化,layer.shouldRasterize = YES 其目的是提高复用,以下4个场景不建议使用
    • 如果 Layer 不能被复用,则没有必要打开光栅化
    • 如果 Layer 不是静态的,需要频繁修改,比如处于动画之中那么开启离屏渲染然而影响效率
    • 离屏渲染缓存内容有时间限制,缓存内容100ms 内如果没有被使用,那么它就会被丢弃,无法进行复用了
    • 离屏渲染缓存空间有限,超过 2.5倍屏幕像素大小的话也会失效,且无法进行复用了
  • 遮罩,layer.mask
  • 圆角,同时设置 layer.masksToBounds = YESlayer.cornerRadius 大于0
    • 考虑通过 CoreGraphics 绘制裁剪圆角,或者叫美工提供圆角图片
    • 在 iOS 9 以后,UIImageView 设置圆角并并裁切不会触发离屏渲染,但如果加上了背景色、边框或其他有图像内容的图层会触发离屏渲染
  • 阴影,layer.shadowXXX,如果设置了 layer.shadowPath 就不会产生离屏渲染

学习资料

⚠️ **GitHub.com Fallback** ⚠️