离屏渲染

2020-07-07  本文已影响0人  奉灬孝
离屏渲染定义

所有渲染操作将渲染到当前绑定的帧缓冲的附加缓冲中,由于我们的帧缓冲不是默认的帧缓冲,渲染命令对窗口的视频输出不会产生任何影响。出于这个原因,它被称为离屏渲染(off-screen rendering),就是渲染到一个另外的缓冲中。

GPU渲染

GPU屏幕渲染有以下两种方式:

On-Screen Rendering意为当前屏幕渲染,指的是GPU的渲染操作是在当前用于显示的屏幕缓冲区中进行。

Off-Screen Rendering意为离屏渲染,指的是GPU在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作。

相比于当前屏幕渲染,离屏渲染的代价是很高的,主要体现在两个方面:

CPU渲染

特殊的离屏渲染:如果将不在GPU的当前屏幕缓冲区中进行的渲染都称为离屏渲染,那么就还有另一种特殊的“离屏渲染”方式: CPU渲染Core Graphics做绘制的时候,会有上下文Context,也有一个Bitmap画布,但是这个Bitmap画布是在CPU内存上面的,上下文Context也和上面说的环境转换:昂贵的环境转换(转换环境到屏幕外缓冲区,然后转换环境到帧缓冲区)不是一码概念。因此把CPU绘制归为离屏渲染个人感觉非常不妥。
其主要意思是:
Core Graphics 的绘制 API 的确会触发离屏渲染,但不是那种 GPU 的离屏渲染。使用 Core Graphics 绘制 API 是在 CPU 上执行,触发的是 CPU 版本的离屏渲染。

离屏渲染产生原因

当视图中有多个图层(Layer)需要借助离屏缓冲区完成完成一些更复杂的、多次的修改/剪裁操作,便会触发离屏渲染。比如下面讲的离屏渲染的触发方式

离屏渲染的触发方式

设置了以下属性时,都会触发离屏绘制:

// 用 CAShapeLayer 画一个圆角矩形
#import "ViewController.h" 
@interface ViewController () 
@property (nonatomic, weak) IBOutlet UIView *layerView; 
@end 

@implementation ViewController 
- (void)viewDidLoad {
    [super viewDidLoad]; 
    //create shape layer 
     CAShapeLayer *blueLayer = [CAShapeLayer layer]; 
     blueLayer.frame = CGRectMake(50, 50, 100, 100); 
     blueLayer.fillColor = [UIColor blueColor].CGColor; 
     blueLayer.path = [UIBezierPath bezierPathWithRoundedRect: CGRectMake(0, 0, 100, 100) cornerRadius:20].CGPath; 
     //add it to our view 
     self.layerView.layer addSublayer:blueLayer]; 
}
@end
上一篇 下一篇

猜你喜欢

热点阅读