iOS高效添加圆角

1.什么是离屏渲染

gpu(图形学处理器)屏幕渲染有两种方式:

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

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

2.为什么离屏渲染的代价很大

离屏渲染需要在当前屏幕缓冲区以外创建一个新的缓冲区。

整个离屏渲染的过程中,需要进行多次上下文切换。

首先从将上下文环境从当前屏幕切换到离屏进行离屏渲染。渲染结束以后,需要将离屏渲染缓冲区的结果显示到屏幕上。然后再将上下文环境从离屏切换到当前屏幕。然而,上下文切换的代价是很大的。

3.离屏渲染的触发方式

在设置了以下属性以后,都会触发离屏渲染:

shouldRasterize(光栅化)//光栅化和离屏渲染的问题再研究

masks(遮罩)

ps:设置圆角语句本身并不会触发离屏渲染。view.layer.cornerRadius = 5;

但是设置圆角属性只在一些特定情况下有效,即视图的背景和边界。如果要给UILabel设置圆角属性,就需要两行代码:

label.layer.cornerRadius = 5;

label.layer.masksToBounds = true; 

而第二行代码设置masksToBounds就会触发离屏渲染。

shadows(阴影)

edge antialiasing(抗锯齿)

group opacity(不透明)

4.特殊的离屏渲染

按照之前的说法,如果将不在GPU的当前屏幕缓冲区中进行的渲染都称为离屏渲染,那么就还有另一种特殊的“离屏渲染”方式:CPU渲染。

如果我们重写了drawRect方法,并且使用任何Core Graphics的技术进行了绘制操作,就涉及到了CPU渲染。整个渲染过程由CPU在App内同步地完成,渲染得到的bitmap最后再交由GPU用于显示。

5.屏幕渲染的选择

现在有三种屏幕渲染方式:当前屏幕渲染方式、离屏渲染、CPU渲染。

尽量使用当前屏幕渲染

鉴于离屏渲染、CPU渲染可能带来的性能问题,一般情况下,我们要尽量使用当前屏幕渲染。

离屏渲染 VS CPU渲染

由于GPU的浮点运算能力比CPU强,CPU渲染的效率可能不如离屏渲染;但如果仅仅是实现一个简单的效果,直接使用CPU渲染的效率又可能比离屏渲染好,毕竟离屏渲染要涉及到缓冲区创建和上下文切换等耗时操作。

6.通过设置CALayer的mask

设置view.layer.mask同样会引发离屏渲染问题,从而降低fps(每秒传输帧数量)。

有两种生成遮罩的方式:

// 通过图片生成遮罩

UIImage*maskImage = [UIImageimageNamed:@"someimg"];

CALayer*mask = [CALayernew];mask.frame =CGRectMake(0,0, maskImage.size.width, maskImage.size.height);

mask.contents = (__bridgeid_Nullable)(maskImage.CGImage);

view.layer.mask = mask;

//通过贝塞尔曲线生成

CAShapeLayer*mask = [CAShapeLayernew];

mask.path = [UIBezierPathbezierPathWithOvalInRect:view.bounds].CGPath;

view.layer.mask = mask;

7.利用Core Graphics手动画出圆角

这个方法是在CPU中重新绘制一份圆角视图以达到圆角效果,这样做会增加CPU的开销,。但是这种方式不会触发离屏渲染,不会降低fps。

代码我就不写了,因为我不会用那个什么down 。。。

参考:绘制圆角的四种方法

8.混合图层

在要添加圆角的视图上添加一个部分透明的视图,只对圆角进行遮挡。这种方法不会引起离屏渲染,也不需要占据CPU资源,但是应用场景有限。

参考:

iOS 高效添加圆角效果实战讲解

小心别让圆角成了你列表的帧数杀手

离屏渲染学习

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念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

推荐阅读更多精彩内容

  • 高效使用圆角 1、在默认情况下,圆角属性只会影响视图的背景颜色和border,对于UILabel这样内部还有子视图...
    Visitor阅读 1,367评论 0 2
  • 圆角是一种很常见的视图效果,相比于直角,它更加柔和优美,易于接受。设置圆角会带来一定的性能损耗,如何提高性能是一个...
    Chars阅读 510评论 0 8
  • 绘制像素到屏幕上 answer-huang22 Mar 2014 分享文章 一个像素是如何绘制到屏幕上去的?有很多...
    阿狸旅途T恤阅读 1,567评论 0 7
  • 卷首语 欢迎来到 objc.io 的第三期! 这一期都是关于视图层的。当然视图层有很多方面,我们需要把它们缩小到几...
    评评分分阅读 1,716评论 0 18
  • 最近一朋友告诉我,她发现自己的老公似乎有了外遇,她不知道怎么办,于是假装没听见,假装没看见,虽然心里有数,但却露出...
    我愛一個幼稚鬼阅读 671评论 0 0