離屏渲染

1匣距、什么是離屏渲染?

1)On-Screen Rendering

意為當(dāng)前屏幕渲染哎壳,指的是 GPU 的渲染操作是在當(dāng)前用于顯示的屏幕緩沖區(qū)中進行毅待。

2)Off-Screen Rendering

意為離屏渲染,指的是 GPU 在當(dāng)前屏幕緩沖區(qū)以外新開辟一個緩沖區(qū)進行渲染操作归榕。

2尸红、離屏渲染觸發(fā)的時機

當(dāng)圖層屬性的混合體被指定為在未預(yù)合成之前不能直接在屏幕中繪制時,屏幕外渲染就被喚起了刹泄。屏幕外渲染并不意味著軟件繪制驶乾,但是它意味著圖層必須在被顯示之前在一個屏幕外上下文中被渲染(不論 CPU 還是 GPU)。

離屏渲染可以被 Core Animation 自動觸發(fā)循签,或者被應(yīng)用程序強制觸發(fā)级乐。屏幕外的渲染會合并/渲染圖層樹的一部分到一個新的緩沖區(qū),然后該緩沖區(qū)被渲染到屏幕上县匠。

這里提到的 offscreen rendering 主要講的是通過 GPU 執(zhí)行的 offscreen,事實上還有的 offscreen rendering 是通過 CPU 來執(zhí)行的风科。

如果我們重寫了 drawRect 方法,并且使用任何 Core Graphics 的技術(shù)進行了繪制操作乞旦,就涉及到了 CPU 渲染贼穆。整個渲染過程由 CPU 在 App 內(nèi)同步地完成,渲染得到的 bitmap 最后再交由 GPU 用于顯示兰粉。其它類似 cornerRadios, masks, shadows 等觸發(fā)的 offscreen 是基于 GPU 的故痊。

PS:CoreGraphic 通常是線程安全的,所以可以進行異步繪制玖姑,顯示的時候再放回主線程愕秫。

2.1 觸發(fā)離屏渲染的方式

1、圓角(當(dāng)和maskToBounds一起使用時)

2焰络、圖層蒙版

3戴甩、陰影

4、光柵化:設(shè)置 shouldRasterize = YES 便會觸發(fā)光柵化

光柵化的概念:

將圖轉(zhuǎn)化為一個個柵格組成的圖像闪彼,即從矢量的點線面的描述甜孤,變成像素的描述。

光柵化是一種特殊的離屏渲染畏腕,它的主要工作量集中在?CPU?上缴川,而不是前文介紹的那種 GPU 單獨開辟緩存進行圖形生成計算,并且 CPU 光柵化完成后會將該 bitmap 緩存于本地描馅,以便重復(fù)利用把夸,它在形式上也是一種離屏渲染,但不屬于 OpenGL 名字中特指的那種 GPU 新開 buffer 生成圖形的過程流昏。?

光柵化注意兩點:

1扎即、不要過度使用,系統(tǒng)限制了緩存的大小為 2.5X Screen Size.

如果過度使用,超出緩存之后,同樣會造成大量的 offscreen 渲染。

2况凉、被光柵化的圖片如果超過?100ms?沒有被使用,則會被移除

因此我們應(yīng)該只對連續(xù)不斷使用的圖片進行緩存谚鄙。對于不常使用的圖片緩存是沒有意義,且耗費資源的。


注:對于那些需要動畫而且要在屏幕外渲染的圖層來說刁绒,你可以用 CAShapeLayer闷营,contentsCenter 或者shadowPath 來獲得同樣的表現(xiàn)而且較少地影響到性能。

3知市、為什么要盡量避免離屏渲染?

一般導(dǎo)致圖形性能的問題大部分都出在了 offscreen rendering, 因此如果我們發(fā)現(xiàn)列表滾動不流暢,動畫卡頓等問題,就可以想想和找出我們哪部分代碼導(dǎo)致了大量的 offscreen 渲染。

離屏渲染主要在兩個地方開銷較大:

1俩功、創(chuàng)建新緩沖區(qū)

要想進行離屏渲染憾儒,首先要創(chuàng)建一個新的緩沖區(qū)。

2跟啤、上下文切換

離屏渲染的整個過程诽表,需要多次切換上下文環(huán)境:先是從當(dāng)前屏幕(On-Screen)切換到離屏(Off-Screen);等到離屏渲染結(jié)束以后隅肥,將離屏緩沖區(qū)的渲染結(jié)果顯示到屏幕上竿奏,又需要將上下文環(huán)境從離屏切換到當(dāng)前屏幕。而上下文環(huán)境的切換是要付出很大代價的腥放。

4泛啸、硬件加速

硬件加速是指用到了 GPU 的 API,以下這些情況不會用到硬件加速

1)使用 CGContexts 繪制的圖形

2)所有在 drawRect 中完成的圖形繪制秃症。

3)shouldRasterize 屬性為 YES 的 CALayer(在 CPU 渲染)候址。

4)用到了 mask 或 drop shadow 的 CALayer。

5)Text (包括UILabels, CATextLayers, Core Text, 等等)


參考文檔:iOS圖形原理與離屏渲染

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末种柑,一起剝皮案震驚了整個濱河市宗雇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌莹规,老刑警劉巖赔蒲,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異良漱,居然都是意外死亡舞虱,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門母市,熙熙樓的掌柜王于貴愁眉苦臉地迎上來矾兜,“玉大人,你說我怎么就攤上這事患久∫嗡拢” “怎么了浑槽?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長返帕。 經(jīng)常有香客問我桐玻,道長,這世上最難降的妖魔是什么荆萤? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任镊靴,我火速辦了婚禮,結(jié)果婚禮上链韭,老公的妹妹穿的比我還像新娘偏竟。我一直安慰自己,他們只是感情好敞峭,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布踊谋。 她就那樣靜靜地躺著,像睡著了一般旋讹。 火紅的嫁衣襯著肌膚如雪褪子。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天骗村,我揣著相機與錄音嫌褪,去河邊找鬼。 笑死胚股,一個胖子當(dāng)著我的面吹牛笼痛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播琅拌,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼缨伊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了进宝?” 一聲冷哼從身側(cè)響起刻坊,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎党晋,沒想到半個月后谭胚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡未玻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年灾而,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扳剿。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡旁趟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出庇绽,到底是詐尸還是另有隱情锡搜,我是刑警寧澤橙困,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站耕餐,受9級特大地震影響凡傅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蛾方,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望上陕。 院中可真熱鬧桩砰,春花似錦、人聲如沸释簿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽庶溶。三九已至煮纵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間偏螺,已是汗流浹背行疏。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留套像,地道東北人酿联。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像夺巩,于是被迫代替她去往敵國和親贞让。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 相比于當(dāng)前屏幕渲染柳譬,離屏渲染的代價是很高的喳张,這也是iOS移動端優(yōu)化的必要部分。 OpenGL中美澳,GPU屏幕渲染有以...
    一個人在路上走下去閱讀 8,838評論 0 74
  • 圖像顯示原理 圖像顯示的大概流程: 程序運行從內(nèi)存中讀取數(shù)據(jù)對圖片進行解壓得到像素數(shù)據(jù)销部,若GPU不支持圖片的顏色格...
    foreverSun_122閱讀 593評論 0 2
  • Core Animation工具用來監(jiān)測Core Animation性能。它給我們提供了周期性的FPS制跟,并且考慮到...
    F麥子閱讀 819評論 0 1
  • CALayer與UIView iOS界面中柴墩,看到的界面元素基本都是UIView,例如按鈕凫岖,文本江咳,圖片等都是集成自U...
    conowen閱讀 1,352評論 0 2
  • 一、概述 OpenGL ES是一套多功能開放標(biāo)準(zhǔn)的用于嵌入系統(tǒng)的C-based的圖形庫哥放,用于2D和3D數(shù)據(jù)的可視化...
    灣里有桃樹閱讀 524評論 0 0