iOS離屏渲染的原理

Core Animation渲染流水線(xiàn)工作流程

我們的App本身是不負(fù)責(zé)渲染的够掠,渲染由Render Server進(jìn)程來(lái)完成。

  1. App處理事件盅惜。這個(gè)過(guò)程會(huì)更新圖層樹(shù)伐割。
  2. App使用CPU完成計(jì)算,打包發(fā)給Render Server笙隙。這些計(jì)算包括圖層創(chuàng)建洪灯、布局、文本繪制竟痰、圖片解碼等签钩。
  3. Render Server 調(diào)用OpenGL、Core Graphics凯亮,使用GPU完成圖像的渲染边臼。
  4. GPU通過(guò)Frame Buffer(幀緩沖區(qū))和視頻控制器等將圖像在屏幕上顯示。

離屏渲染觸發(fā)原理


以上案例代碼中假消,模擬器打開(kāi)了離屏渲染展示開(kāi)關(guān)“Color Off-screen Rendered”柠并。左側(cè)一列是三個(gè)UIImageView,右側(cè)一列是三個(gè)UIButton富拗【视瑁可以看到兩列的第三個(gè)控件都發(fā)生了離屏渲染。

  • 普通渲染

    當(dāng)我們?yōu)橐粋€(gè)UIButton設(shè)置一個(gè)背景顏色和一個(gè)圖片啃沪,渲染時(shí)粘拾,會(huì)按圖層依次存入幀緩沖區(qū)。
  • 渲染流程:


  • 離屏渲染

    當(dāng)我們?yōu)橐粋€(gè)UIButton設(shè)置一個(gè)背景顏色和一個(gè)圖片创千,同時(shí)設(shè)置了圓角和maskToBounds缰雇,渲染時(shí),會(huì)將圖層存入離屏渲染緩沖區(qū)觸發(fā)離屏渲染追驴。當(dāng)設(shè)置了maskToBounds時(shí)械哟,要對(duì)背景圖層和內(nèi)容圖層同時(shí)進(jìn)行圓角裁剪,這時(shí)就不能按照普通的渲染流程一層一層的顯示并丟棄殿雪。
  • 渲染流程:


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

App需要進(jìn)行額外的渲染和合并時(shí)會(huì)觸發(fā)離屏渲染暇咆。一方面,設(shè)置了特殊的效果丙曙,一次性不能完成渲染時(shí)爸业,系統(tǒng)會(huì)自動(dòng)觸發(fā)離屏渲染,使用Off-screen Buffer保存中間狀態(tài)亏镰;另一方面扯旷,出于效率優(yōu)勢(shì)的考量,希望復(fù)用的效果可以通過(guò)設(shè)置layer的shouldRasterize(光柵化)屬性為yes進(jìn)行復(fù)用索抓。需要注意的是钧忽,離屏渲染緩沖區(qū)是有空間大小限制的某抓,可以存儲(chǔ)屏幕像素點(diǎn)數(shù)量等2.5倍,超過(guò)空間時(shí)離屏渲染無(wú)效惰瓜。當(dāng)存入離屏渲染緩沖區(qū)100ms內(nèi)沒(méi)有被使用,也會(huì)被丟棄汉矿。

  1. 使用了mask的layer(layer.mask)
  2. 需要進(jìn)行裁剪的layer(layer.maskToBounds)
  3. 設(shè)置了組透明度崎坊,并且透明度不為1。(layer.allowsGroupOpacity/ layer.opacity )
  4. 添加了投影的 layer (layer.shadow*)
  5. 采用了光柵化的 layer (layer.shouldRasterize)
  6. 繪制了文字的 layer (UILabel, CATextLayer, Core Text 等)

離屏渲染的缺點(diǎn)

  • 需要使用額外的存儲(chǔ)空間捞蚂,可能會(huì)造成內(nèi)存壓力乐横。
  • 使用離屏渲染緩沖區(qū)存儲(chǔ)的圖層最終還是要通過(guò)放入幀緩沖區(qū)最終顯示在屏幕上掌唾,從離屏渲染緩沖區(qū)進(jìn)入幀緩沖區(qū)也耗費(fèi)時(shí)間,造成性能問(wèn)題男翰,有掉幀的可能。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末纽乱,一起剝皮案震驚了整個(gè)濱河市蛾绎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鸦列,老刑警劉巖租冠,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異薯嗤,居然都是意外死亡顽爹,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)骆姐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)镜粤,“玉大人,你說(shuō)我怎么就攤上這事玻褪∪饪剩” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵归园,是天一觀的道長(zhǎng)黄虱。 經(jīng)常有香客問(wèn)我,道長(zhǎng)庸诱,這世上最難降的妖魔是什么捻浦? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮桥爽,結(jié)果婚禮上朱灿,老公的妹妹穿的比我還像新娘。我一直安慰自己钠四,他們只是感情好盗扒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布跪楞。 她就那樣靜靜地躺著,像睡著了一般侣灶。 火紅的嫁衣襯著肌膚如雪甸祭。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,631評(píng)論 1 305
  • 那天褥影,我揣著相機(jī)與錄音池户,去河邊找鬼。 笑死凡怎,一個(gè)胖子當(dāng)著我的面吹牛校焦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播统倒,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼寨典,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了房匆?” 一聲冷哼從身側(cè)響起耸成,我...
    開(kāi)封第一講書(shū)人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎浴鸿,沒(méi)想到半個(gè)月后墓猎,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赚楚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年毙沾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宠页。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡左胞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出举户,到底是詐尸還是另有隱情烤宙,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布俭嘁,位于F島的核電站躺枕,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏供填。R本人自食惡果不足惜拐云,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望近她。 院中可真熱鬧叉瘩,春花似錦、人聲如沸粘捎。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至泳桦,卻和暖如春汤徽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背灸撰。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工泻骤, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人梧奢。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像演痒,于是被迫代替她去往敵國(guó)和親亲轨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355