一步步學(xué)習(xí)計(jì)算機(jī)視覺(jué) in IOS番外篇(三)離屏渲染

什么是離屏渲染

首先我們來(lái)看一下渲染架構(gòu):


image.png

CPU 計(jì)算好顯示內(nèi)容提交到 GPU,如果要在顯示屏上顯示內(nèi)容,我們至少需要一塊與屏幕像素?cái)?shù)據(jù)量一樣大的幀緩沖區(qū)(frame buffer)萍聊,作為像素?cái)?shù)據(jù)存儲(chǔ)區(qū)域,而這也是GPU存儲(chǔ)渲染結(jié)果的地方黔漂。GPU 渲染完成后將渲染結(jié)果放入frame buffer蹦骑,隨后視頻控制器會(huì)按照 VSync 信號(hào)逐行讀取frame buffer的數(shù)據(jù),經(jīng)過(guò)可能的數(shù)模轉(zhuǎn)換傳遞給顯示器顯示区岗。顯示完成后略板,frame buffer中的數(shù)據(jù)直接丟棄

如果有時(shí)因?yàn)槊媾R一些限制慈缔,無(wú)法把渲染結(jié)果直接寫(xiě)入frame buffer叮称,而是先暫存在另外的內(nèi)存區(qū)域,之后再寫(xiě)入frame buffer藐鹤,那么這個(gè)過(guò)程被稱(chēng)之為離屏渲染瓤檐。

image.png

這里要注意,被iOS認(rèn)定的離屏渲染是GPU產(chǎn)生的娱节,如果重寫(xiě)了drawRect方法挠蛉,并且使用任何Core Graphics 的技術(shù)進(jìn)行了繪制操作,就涉及到CPU渲染肄满。這種CPU渲染可以成為軟件渲染谴古,不會(huì)被iOS系統(tǒng)認(rèn)定為離屏渲染质涛。

離屏渲染帶來(lái)的影響

1)額外的內(nèi)存

離屏渲染需要開(kāi)放一塊內(nèi)存存放渲染數(shù)據(jù),這部分內(nèi)存最大為屏幕展示的2.5倍

2)上下文切換

離屏渲染的整個(gè)過(guò)程需要切換上下文環(huán)境掰担,先從當(dāng)前屏幕切換到離屏汇陆,等結(jié)束后,又要將上下文環(huán)境切換回來(lái)恩敌。雖然在iOS中瞬测,設(shè)備主存和GPU的顯存共享物理內(nèi)存,這樣可以省去一些數(shù)據(jù)傳輸開(kāi)銷(xiāo)纠炮,但是還是要占用系統(tǒng)資源月趟。

離屏渲染的原因

先說(shuō)下我的理解:

離屏渲染是由于渲染層之間存在依賴(lài)引發(fā)的。

在上面的渲染流水線(xiàn)示意圖中我們可以看到恢口,主要的渲染操作都是由CoreAnimation的Render Server模塊孝宗,通過(guò)調(diào)用顯卡驅(qū)動(dòng)所提供的OpenGL/Metal接口來(lái)執(zhí)行的。通常對(duì)于每一層layer耕肩,Render Server會(huì)遵循“畫(huà)家算法”因妇,按次序輸出到frame buffer,后一層 After Layer 會(huì)覆蓋前一層 Before Layer猿诸,就能得到最終的顯示結(jié)果婚被。

但是,如果此時(shí)After Layer的渲染數(shù)據(jù)是半透明的梳虽,需要混合Before Layer的數(shù)據(jù)址芯,按照正常的渲染流程,此時(shí)frame buffer中Before Layer已經(jīng)被丟棄了窜觉,根本無(wú)法進(jìn)行混合谷炸。為了保留Before Layer,iOS開(kāi)辟了離屏渲染緩沖區(qū)禀挫,對(duì)Before Layer進(jìn)行存儲(chǔ)旬陡。

圓角 與 masksToBounds

首先我們要了解 CALayer的層次結(jié)構(gòu):CALayer由背景色backgroundColor、內(nèi)容contents语婴、邊緣borderWidth&borderColor構(gòu)成

image.png

cornerRadius的文檔中明確說(shuō)明:
cornerRadius的設(shè)置只對(duì) CALayer 的背景色層和邊緣層起作用

當(dāng)我們只配置cornerRadius時(shí)描孟,背景色層和邊緣層生成圓角,內(nèi)容層的渲染數(shù)據(jù)是直接覆蓋背景色層砰左,邊緣層的數(shù)據(jù)也是同樣画拾,這時(shí)候不會(huì)觸發(fā)離屏渲染

當(dāng)我們配置 masksToBounds的時(shí)候,這個(gè)時(shí)候菜职,內(nèi)容層也要被裁剪圓角青抛,而裁剪方式依賴(lài)邊緣層。還記得我們說(shuō)過(guò)的酬核,離屏渲染是由于渲染層之間存在依賴(lài)引發(fā)的∶哿恚現(xiàn)在內(nèi)容層與邊緣層就相互依賴(lài)了适室,從而導(dǎo)致了離屏渲染。

常見(jiàn)的觸發(fā)離屏渲染情況

  1. 需要進(jìn)行裁剪的 layer (layer.masksToBounds / view.clipsToBounds)

在View上設(shè)置相同形狀的Mask View举瑰,要背裁剪掉的部分設(shè)置成背景色

image.png
  1. 設(shè)置了組透明度為 YES捣辆,并且透明度不為 1 的 layer (layer.allowsGroupOpacity/ layer.opacity)

這個(gè)只能盡量不要使用

  1. 添加了投影的 layer (layer.shadow*)

使用陰影路徑計(jì)算

  1. 繪制了文字的 layer (UILabel, CATextLayer, Core Text 等)
    盡量使用Label代替

  2. 采用了光柵化的 layer (layer.shouldRasterize)
    這是主動(dòng)進(jìn)行離屏渲染,提高渲染效率.

image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末此迅,一起剝皮案震驚了整個(gè)濱河市汽畴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌耸序,老刑警劉巖忍些,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異坎怪,居然都是意外死亡罢坝,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)搅窿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)嘁酿,“玉大人,你說(shuō)我怎么就攤上這事男应∧炙荆” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵沐飘,是天一觀(guān)的道長(zhǎng)游桩。 經(jīng)常有香客問(wèn)我,道長(zhǎng)薪铜,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任恩溅,我火速辦了婚禮隔箍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘脚乡。我一直安慰自己蜒滩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布奶稠。 她就那樣靜靜地躺著俯艰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪锌订。 梳的紋絲不亂的頭發(fā)上竹握,一...
    開(kāi)封第一講書(shū)人閱讀 51,688評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音辆飘,去河邊找鬼啦辐。 笑死谓传,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的芹关。 我是一名探鬼主播续挟,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼侥衬!你這毒婦竟也來(lái)了诗祸?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤轴总,失蹤者是張志新(化名)和其女友劉穎直颅,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體肘习,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡际乘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了漂佩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脖含。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖投蝉,靈堂內(nèi)的尸體忽然破棺而出养葵,到底是詐尸還是另有隱情,我是刑警寧澤瘩缆,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布关拒,位于F島的核電站,受9級(jí)特大地震影響庸娱,放射性物質(zhì)發(fā)生泄漏着绊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一熟尉、第九天 我趴在偏房一處隱蔽的房頂上張望归露。 院中可真熱鬧,春花似錦斤儿、人聲如沸剧包。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)疆液。三九已至,卻和暖如春陕贮,著一層夾襖步出監(jiān)牢的瞬間堕油,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留馍迄,地道東北人福也。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像攀圈,于是被迫代替她去往敵國(guó)和親暴凑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355