iOS 离屏渲染

原因

  • 在GPU渲染阶段无法确定具体的内容(形状/透明度等),所以需要离屏渲染以确定具体内容之后,在由GPU渲染展示
  • layer在渲染的时候采用的画家算法,一层一层叠加的,如果需要多层共同确定具体内容的情况,就需要额外的内存空间进行离屏渲染。
- a, b ,c ,d ,e  //渲染序列
- c = d + e //c 需要d和e渲染完成后,才能确定
- temp = d + e //临时开辟一块内存空间,存储d和e的渲染结果
- a, b ,temp //再把temp叠加到framebuffer中

离屏渲染常见的几种场景

  • cornerRadius 且 clipToBounds 后
需要在layer及其子layer都渲染完成后,在计算圆角需要剪裁的内容
  • 阴影未设置shadowPath
需要先渲染出layer后,才能确定阴影,所以需要额外保存渲染layer后的状态,在渲染阴影
  • mask 遮罩
同样需要渲染出layer和子layer后才能确定mask内容
  • group opacity
需要group内所有的layer渲染出来之后,在渲染做opacity透明度
  • effectBlur
需要底层内容和blur属性才能显示blur后的内容

一些解决办法

  • 圆角
用shapeLayer,直接用圆角矩形,或者绘制圆角弧形盖在视图上
图片等用coreGraphics提前剪裁出圆角/或者美术提供
  • shadow
用shadowPath确定形状
  • mask
使用layer mask并打开shouldRasterize来对渲染结果进行缓存
  • effectBlur
用CIFilter 的blur滤镜代替

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