iOS-離屏渲染詳解

離屏渲染的定義

GPU由于多個(gè)圖層無(wú)法一次性渲染完成嘴脾,而需要保留其中間狀態(tài)尘执,中間狀態(tài)存放的位置即:offscreen Buffer。而后對(duì)offscreen Buffer中內(nèi)容進(jìn)行整體渲染完成后寫(xiě)入Frame Buffer的整個(gè)流程稱為離屏渲染闸英。如下圖:

渲染的中間狀態(tài)先存放至offscreenBuffer->渲染全部完成后在寫(xiě)入frameBuffer

離屏渲染xcode檢測(cè)的效果圖

圖中黃色區(qū)域會(huì)觸發(fā)離屏渲染

xcode檢測(cè)渲染情況設(shè)置如下:

xcode設(shè)置示意圖

離屏渲染原理

1虑灰、普通渲染流程

普通渲染流程

subLayer1繪制:subLayer1渲染完成——>寫(xiě)入FrameBuffer——>Display——>subLayer1從FrameBuffer中清空

subLayer2繪制:subLayer2渲染完成——>寫(xiě)入FrameBuffer——>Display——>subLayer2從FrameBuffer中清空

subLayer3繪制:subLayer3渲染完成——>寫(xiě)入FrameBuffer——>Display——>subLayer3從FrameBuffer中清空

相對(duì)來(lái)說(shuō):subLayer1、subLayer2、subLayer3之間是相互獨(dú)立的

2蛮粮、離屏渲染流程(進(jìn)行圓角操作)

第一步

如上圖益缎,進(jìn)行圓角裁剪,每個(gè)圖層都需裁剪一次然想,顯然三個(gè)圖層無(wú)法一次渲染完成莺奔,需offscreenBuffer存放其中間狀態(tài)

第二步

subLayer1繪制:從offscreenBuffer中獲取subLayer1進(jìn)行圓角裁剪,渲染完成——>寫(xiě)入FrameBuffer——>Display——>subLayer1從FrameBuffer中清空

subLayer2繪制:從offscreenBuffer中獲取subLayer1進(jìn)行圓角裁剪变泄,渲染完成——>寫(xiě)入FrameBuffer——>Display——>subLayer2從FrameBuffer中清空

subLayer3繪制:從offscreenBuffer中獲取subLayer1進(jìn)行圓角裁剪令哟,渲染完成——>寫(xiě)入FrameBuffer——>Display——>subLayer3從FrameBuffer中清空

以上流程中subLayer1、subLayer2妨蛹、subLayer3之間相對(duì)獨(dú)立屏富,但圖層間若有相互關(guān)聯(lián)時(shí),需額外的處理蛙卤,如:圖層疊加狠半,會(huì)有額外計(jì)算和渲染。

常見(jiàn)離屏渲染場(chǎng)景總結(jié)

1颤难、cornerRadius+clipsToBounds(裁剪+圓角)

2神年、shadow(陰影)

3、group opacity(組透明度)

4行嗤、mask(遮蓋)

5已日、UIBlurEffect(毛玻璃)

對(duì)離屏渲染效率的小改進(jìn)(shouldRasterize光柵化)

離屏渲染開(kāi)銷(xiāo)很大,會(huì)影響性能栅屏。為盡量降低離屏渲染帶來(lái)的影響捂敌,可對(duì)其優(yōu)化。如:對(duì)第一幀已經(jīng)裁出了圓角既琴,則將其結(jié)果緩存下來(lái)占婉,下一幀渲染復(fù)用該緩存效果,避免重新裁剪一次甫恩。

CALayer為提供了:shouldRasterize逆济。一旦被設(shè)置為true,Render Server就會(huì)強(qiáng)制把layer的渲染結(jié)果(包括其子layer磺箕,以及圓角奖慌、陰影、group opacity等等)保存在一塊內(nèi)存中松靡,則下一幀可以復(fù)用简僧,而不會(huì)再次觸發(fā)離屏渲染。

注意點(diǎn):

1雕欺、shouldRasterize至少會(huì)觸發(fā)一次離屏渲染岛马。如果你的layer本來(lái)并不復(fù)雜棉姐,也沒(méi)有圓角陰影等等,打開(kāi)這個(gè)開(kāi)關(guān)反而會(huì)增加一次不必要的離屏渲染

2啦逆、離屏渲染緩存有空間上限伞矩,最多不超過(guò)屏幕總像素的2.5倍大小

3、一旦緩存超過(guò)100ms沒(méi)有被使用夏志,會(huì)自動(dòng)被丟棄

4乃坤、layer的內(nèi)容(包括子layer)必須是靜態(tài)的,因?yàn)橐坏┌l(fā)生變化(如resize沟蔑,動(dòng)畫(huà))湿诊,之前辛苦處理得到的緩存就失效了。如果這件事頻繁發(fā)生瘦材,我們就又回到了“每一幀都需要離屏渲染”的情景厅须,而這正是開(kāi)發(fā)者需要極力避免的。針對(duì)這種情況宇色,Xcode提供了“Color Hits Green and Misses Red”的選項(xiàng)九杂,幫助我們查看緩存的使用是否符合預(yù)期

彩蛋:除了解決多次離屏渲染的開(kāi)銷(xiāo),shouldRasterize可應(yīng)用于另一個(gè)場(chǎng)景:如果layer的子結(jié)構(gòu)非常復(fù)雜宣蠕,渲染一次所需時(shí)間較長(zhǎng)例隆,同樣可以打開(kāi)這個(gè)開(kāi)關(guān),把layer繪制到一塊緩存抢蚀,然后在接下來(lái)復(fù)用這個(gè)結(jié)果镀层,這樣就不需要每次都重新繪制整個(gè)layer樹(shù)

思考

CPU渲染緩解GPU壓力?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末皿曲,一起剝皮案震驚了整個(gè)濱河市唱逢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌屋休,老刑警劉巖坞古,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異劫樟,居然都是意外死亡痪枫,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門(mén)叠艳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)奶陈,“玉大人,你說(shuō)我怎么就攤上這事附较〕粤#” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵拒课,是天一觀的道長(zhǎng)徐勃。 經(jīng)常有香客問(wèn)我事示,道長(zhǎng),這世上最難降的妖魔是什么疏旨? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任很魂,我火速辦了婚禮扎酷,結(jié)果婚禮上檐涝,老公的妹妹穿的比我還像新娘。我一直安慰自己法挨,他們只是感情好谁榜,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著凡纳,像睡著了一般窃植。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上荐糜,一...
    開(kāi)封第一講書(shū)人閱讀 49,730評(píng)論 1 289
  • 那天巷怜,我揣著相機(jī)與錄音,去河邊找鬼暴氏。 笑死延塑,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的答渔。 我是一名探鬼主播关带,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼沼撕!你這毒婦竟也來(lái)了宋雏?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤务豺,失蹤者是張志新(化名)和其女友劉穎磨总,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體笼沥,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蚪燕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了敬拓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片邻薯。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖乘凸,靈堂內(nèi)的尸體忽然破棺而出厕诡,到底是詐尸還是另有隱情,我是刑警寧澤营勤,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布灵嫌,位于F島的核電站壹罚,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏寿羞。R本人自食惡果不足惜猖凛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望绪穆。 院中可真熱鬧辨泳,春花似錦、人聲如沸玖院。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)难菌。三九已至试溯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間郊酒,已是汗流浹背遇绞。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留燎窘,地道東北人摹闽。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像荠耽,于是被迫代替她去往敵國(guó)和親钩骇。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348