iOS离屏渲染

iOS-离屏渲染详解
关于iOS离屏渲染的深入研究
关于离屏渲染这两片文章分析的很详细。

渲染过程

ios-core-animation-pipeline-steps.png

根据渲染流水线示意图,渲染操作的过程CoreAnimation->Render Server->OpenGL/Metal->GPU->显示。
Render Server会遵循“画家算法”,画家算法先画远景,然后画近景。Render Server根据sublayer添加的顺序按次序输出到frame buffer,显示到屏幕上的时候,后一层覆盖前一层,就能得到最终的显示结果,已经完成显示的数据将会被丢弃。
由于frame buffer中的渲染数据完成显示,会被GPU丢弃,如果我们对它修改就需要保存在新的一个内存空间中,这个新开辟的内存空间就会造成离屏渲染

离屏渲染既然会影响性能为什么还要用?

  1. 特殊效果,需要使⽤额外的offscreen Buffer 保存中间状态,不得不使⽤离屏渲染 -> 系统⾃动触发. 圆 ⻆,阴影;
  2. 效率的优势: 既然效果会多次屏幕-> 提前渲染 offscreenBuffer -> 复⽤⽬的‘

缺点:

  • 离屏渲染需要频繁切换OpenGL es上下文,这个上下文是个巨大的状态机。先从当前屏幕渲染完成切换到离屏,将离屏缓冲区的渲染结果显示到屏幕上后,需要将上下文环境从离屏切换到当前屏幕。每次切换上下文,必须刷新渲染管线。

在iOS中会触发离屏渲染的操作

  • 光栅化,layer.shouldRasterize = YES
  • 遮罩,layer.mask
  • 圆角,同时设置 layer.masksToBounds = YES,layer.cornerRadius > 0
  • shadow阴影
  • layer.allowGorupOpacity/layer.opacity设置了组透明度
  • 绘制了文字的layer()
  1. shouldRasterize的使用建议

    • 如果layer不能被复用,没有必要开启光栅化
    • 如果layer不是静态的,需要被频繁修改,比如layer有动画,那么开启光栅化反而影响效率
    • 离屏渲染缓存有时间限制,缓存内容100ms没有被使用,那么缓存内容就会被丢弃。
    • 离屏渲染缓存空间有限,超过屏幕像素点2.5被也会失效。
  2. layer.mask 遮罩
    遮罩操作需要进行多次OpenGL es的混合操作,mask+整个layer = 需要的view。由于GPU不能一次完成,因为遮罩会用到OpenGL es的混合,首先需要绘制layer图层,获取mask的图片转换成纹理数据,然后再最后将mask与layer混合成我需要的蒙板视图。
    而frame buffer无法对已经处理好的数据进行修改(16.7ms完成一次遍历)。所以利用离屏缓冲区可以长效保存的特性,将mask和layer存入离屏缓冲区然后进行混合操作。

  3. layer.cornerRadius 会设置background和border的圆角,不会设置image的layer.content的圆角,需要设置layer.masksToBounds=YES才会成功。

Setting the radius to a value greater than 0.0 causes the layer to begin drawing rounded corners on its background. By default, the corner radius does not apply to the image in the layer’s contents property; it applies only to the background color and border of the layer. However, setting the masksToBounds property to true causes the content to be clipped to the rounded corners. ——Apple 官方文档

离屏渲染

//1.按钮存在背景图片
UIButton *btn1 = [UIButton buttonWithType:UIButtonTypeCustom]; 
btn1.frame = CGRectMake(100, 30, 100, 100);
btn1.layer.cornerRadius = 50;
[self.view addSubview:btn1];

[btn1 setImage:[UIImage imageNamed:@"btn.png"] forState:UIControlStateNormal];
btn1.clipsToBounds = YES;

//2.按钮不存在背景图片
UIButton *btn2 = [UIButton buttonWithType:UIButtonTypeCustom];
btn2.frame = CGRectMake(100, 180, 100, 100);
btn2.layer.cornerRadius = 50;
btn2.backgroundColor = [UIColor blueColor];
[self.view addSubview:btn2];
btn2.clipsToBounds = YES;

//3.UIImageView 设置了图片+背景色;
UIImageView *img1 = [[UIImageView alloc]init];
img1.frame = CGRectMake(100, 320, 100, 100);
img1.backgroundColor = [UIColor blueColor];
[self.view addSubview:img1];
img1.layer.cornerRadius = 50;
img1.layer.masksToBounds = YES;
img1.image = [UIImage imageNamed:@"btn.png"];

//4.UIImageView 只设置了图片,无背景色;
UIImageView *img2 = [[UIImageView alloc]init];
img2.frame = CGRectMake(100, 480, 100, 100);
[self.view addSubview:img2];
img2.layer.cornerRadius = 50;
img2.layer.masksToBounds = YES;
img2.image = [UIImage imageNamed:@"btn.png"];

`
打开离屏渲染效果


offscreen.png

设置圆角的时候,只有在view中有图片和背景色,设置圆角会造成离屏渲染,而单个背景色和单个图片的时候不会触发离屏渲染。

圆角的处理

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,026评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,655评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,726评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,204评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,558评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,731评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,944评论 2 314
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,698评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,438评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,633评论 2 247
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,125评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,444评论 3 255
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,137评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,103评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,888评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,772评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,669评论 2 271