当前屏幕渲染(On-Screen Rendering): 指的是GPU直接在当前显示的屏幕缓冲区中进行图形渲染,不需要提前另开缓冲区就不需要缓冲区的切换,因此性能较高;
离屏渲染(Off-Screen Rendering): 提前另开一个缓冲区进行图形渲染,由于需要显示和当前屏幕缓冲区进行切换,所以很耗费性能. 通常圆角,遮罩,不透明度,阴影,渐变,光栅花和抗锯齿等设置都会触发离屏渲染.
离屏渲染 实现圆角:
IOS中圆角效果实现的最简单,最直接的方式,是直接修改View的Layer层参数,会触发'离屏渲染',性能不高:
/* 设置圆角半径 */
view.layer.cornerRadius = 5;
/* 将边界以外的区域遮盖住 */
view.layer.masksToBounds = YES;
当前屏幕渲染实现圆角:
另外一种则是实现on-screen-rendering,直接在当前屏幕渲染绘制,提高性能。
为UIImage类扩展一个实例函数:
/**
* On-screen-renderring绘制UIImage矩形圆角
*/
- (UIImage *)imageWithCornerRadius:(CGFloat)radius ofSize:(CGSize)size{
/* 当前UIImage的可见绘制区域 */
CGRect rect = (CGRect){0.f,0.f,size};
/* 创建基于位图的上下文 */
UIGraphicsBeginImageContextWithOptions(size, NO, UIScreen.mainScreen.scale);
/* 在当前位图上下文添加圆角绘制路径 */
CGContextAddPath(UIGraphicsGetCurrentContext(), [UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:radius].CGPath);
/* 当前绘制路径和原绘制路径相交得到最终裁剪绘制路径 */
CGContextClip(UIGraphicsGetCurrentContext());
/* 绘制 */
[self drawInRect:rect];
/* 取得裁剪后的image */
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
/* 关闭当前位图上下文 */
UIGraphicsEndImageContext();
return image;
}