三、iOS离屏渲染

2020-07-07  本文已影响0人  随意昵称你能懂得

iOS离屏渲染

圆角不一定会造成离屏渲染

GPU屏幕渲染方式

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

离屏渲染的意义

  1. 用户需要特殊的渲染效果:使用额外的离屏缓冲区(offscreen butter)保存中间状态,最后叠加、处理后绘制在屏幕上,这样就不得不使用离屏渲染
  2. 效率优势:需要多次使用的效果,提前渲染存入离屏缓冲区,然后复用来提高效率

离屏渲染的问题

  1. 内存开支:开辟离屏缓冲区(大小不超过2.5倍屏幕像素大小)
  2. 时间和性能开支:从离屏缓冲区拷贝数据到帧缓冲区,上下文切换耗性能

如何检查离屏渲染

打开模拟器的 Debug - Color Off-screen Rendered 工具来检测是否触发离屛渲染,控件标黄即为触发了离屏渲染

造成离屏渲染情况

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

shouldRasterize 光栅化使用建议

处理圆角方式

参考UIImage+YYAdd中的方法
- (UIImage *)imageByRoundCornerRadius:(CGFloat)radius
corners:(UIRectCorner)corners
borderWidth:(CGFloat)borderWidth
borderColor:(UIColor *)borderColor
borderLineJoin:(CGLineJoin)borderLineJoin

上一篇 下一篇

猜你喜欢

热点阅读