OffScreenRendering - ShenYj/ShenYj.github.io GitHub Wiki
在 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 = YES
、layer.cornerRadius
大于0- 考虑通过
CoreGraphics
绘制裁剪圆角,或者叫美工提供圆角图片 - 在 iOS 9 以后,
UIImageView
设置圆角并并裁切不会触发离屏渲染,但如果加上了背景色、边框或其他有图像内容的图层会触发离屏渲染
- 考虑通过
- 阴影,
layer.shadowXXX
,如果设置了layer.shadowPath
就不会产生离屏渲染