iOS离屏渲染
圆角不一定会造成离屏渲染
GPU屏幕渲染方式
- On-Screen Rendering 当前屏幕渲染: 是GPU的渲染操作是在当前用于显示的屏幕缓冲区中进行
- Off-Screen Rendering 离屏渲染: GPU在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作
离屏渲染的意义
- 用户需要特殊的渲染效果:使用额外的离屏缓冲区(offscreen butter)保存中间状态,最后叠加、处理后绘制在屏幕上,这样就不得不使用离屏渲染
- 效率优势:需要多次使用的效果,提前渲染存入离屏缓冲区,然后复用来提高效率
离屏渲染的问题
- 内存开支:开辟离屏缓冲区(大小不超过2.5倍屏幕像素大小)
- 时间和性能开支:从离屏缓冲区拷贝数据到帧缓冲区,上下文切换耗性能
如何检查离屏渲染
打开模拟器的 Debug - Color Off-screen Rendered 工具来检测是否触发离屛渲染,控件标黄即为触发了离屏渲染
造成离屏渲染情况
- 使用了 mask 的 layer (layer.mask)
- 需要进行裁剪的 layer (layer.masksToBounds / view.clipsToBounds)
- 设置了组透明度为 YES ,并且透明度不为 1 的 layer (layer.allowsGroupOpacity/layer.opactiy)
- 添加了投影的 layer (layer.shadow*)
- 采用了光栅化的 layer (layer.shouldRasterize)
- 绘制了文字的 layer (UILabel, CATextLayer, Core Text 等)
shouldRasterize 光栅化使用建议
- 如果layer不能被复用,则没有必要打开光栅化;
- 如果layer不是静态的,需要被频繁修改,比如处于动画之中,那么开启离屏渲染反而影响效率了;
- 离屏渲染缓存内容有时间限制,缓存内容100ms内容如果没有被使用,那么它就会丢弃,无法进行复用;
- 离屏渲染缓存空间有限制,超过2.5倍屏幕像素大小也会失效,且无法进行复用。
处理圆角方式
- 只对图片做裁剪,不是多个图层
- 贝塞尔曲线画背景图
- 给图片用贝塞尔曲线做裁剪
- 直接用图片做背景图
参考UIImage+YYAdd中的方法
- (UIImage *)imageByRoundCornerRadius:(CGFloat)radius
corners:(UIRectCorner)corners
borderWidth:(CGFloat)borderWidth
borderColor:(UIColor *)borderColor
borderLineJoin:(CGLineJoin)borderLineJoin
网友评论