每日一問(wèn)03——影響渲染的性能原因

每日一問(wèn)02冒黑,知道了渲染的大致流程以后熄攘,我們?cè)陂_發(fā)的時(shí)候要注意些什么呢?有什么會(huì)影響到渲染的性能孕蝉?知識(shí)的搬運(yùn)工就是我屡律,我又來(lái)了

接上文,我知道了圖像渲染主要是由GPU完成的昔驱,那么會(huì)不會(huì)有一些情況影響GPU的性能呢疹尾?

圖像對(duì)GPU的影響

1. 圖像多層次的合成—為何設(shè)置透明會(huì)增加GPU工作量

在圖形世界中,合成是一個(gè)描述不同位圖如何放到一起來(lái)創(chuàng)建你最終在屏幕上看到圖像的過(guò)程骤肛。
一個(gè)不透明的紅色蓋在藍(lán)色上那我們看到的就是一個(gè)藍(lán)色纳本,但一個(gè)半透明的紅色蓋在藍(lán)色讓我們得到的卻是一個(gè)紫色,這便是合成所要做的工作腋颠。

我們可以用下面這個(gè)公式來(lái)計(jì)算每一個(gè)像素:

R = S + D * ( 1 – Sa )

結(jié)果的顏色是源色彩(頂端紋理)+目標(biāo)顏色(低一層的紋理)*(1-源顏色的透明度)繁成。在這個(gè)公式中所有的顏色都假定已經(jīng)預(yù)先乘以了他們的透明度。

假定兩個(gè)紋理都完全不透明淑玫,比如 alpha=1.如果目標(biāo)紋理(低一層的紋理)是藍(lán)色(RGB=0,0,1)巾腕,并且源紋理(頂層的紋理)顏色是紅色(RGB=1,0,0)面睛,因?yàn)?Sa 為1,所以結(jié)果為:

R = S

如果源顏色層為50%的透明尊搬,比如 alpha=0.5叁鉴,既然 alpha 組成部分需要預(yù)先乘進(jìn) RGB 的值中,那么 S 的 RGB 值為(0.5, 0, 0)佛寿,公式看起來(lái)便會(huì)像這樣:

arch04.png

所以當(dāng)源紋理是完全不透明的時(shí)候幌墓,目標(biāo)像素就等于源紋理。這可以省下 GPU 很大的工作量
這也是為什么 CALayer 有一個(gè)叫做 opaque 的屬性了冀泻。如果這個(gè)屬性為 NO常侣,GPU 將不會(huì)做任何合成,而是簡(jiǎn)單從這個(gè)層拷貝弹渔,不需要考慮它下方的任何東西(因?yàn)槎急凰趽踝×?
優(yōu)化點(diǎn):在多圖層疊加的情況下胳施,圖層不需要透明度時(shí),最好將opaque設(shè)置為NO

2.圖層對(duì)齊—為何圖片縮放會(huì)增加GPU工作量

簡(jiǎn)單的情況:
1.當(dāng)所有的像素是對(duì)齊的時(shí)候我們得到相對(duì)簡(jiǎn)單的計(jì)算公式肢专。每當(dāng) GPU 需要計(jì)算出屏幕上一個(gè)像素是什么顏色的時(shí)候舞肆,它只需要考慮在這個(gè)像素之上的所有 layer 中對(duì)應(yīng)的單個(gè)像素,并把這些像素合并到一起鸟召。
2.如果最頂層的紋理是不透明的(即圖層樹的最底層)胆绊,這時(shí)候 GPU 就可以簡(jiǎn)單的拷貝它的像素到屏幕上氨鹏。

當(dāng)一個(gè) layer 上所有的像素和屏幕上的像素完美的對(duì)應(yīng)整齊欧募,那這個(gè) layer 就是像素對(duì)齊的。主要有兩個(gè)原因可能會(huì)造成不對(duì)齊仆抵。

第一個(gè)便是滾動(dòng)跟继;當(dāng)一個(gè)紋理上下滾動(dòng)的時(shí)候,紋理的像素便不會(huì)和屏幕的像素排列對(duì)齊镣丑。
另一個(gè)原因便是當(dāng)紋理的起點(diǎn)不在一個(gè)像素的邊界上舔糖。

在這兩種情況下,GPU 需要再做額外的計(jì)算莺匠。它需要將源紋理上多個(gè)像素混合起來(lái)金吗,生成一個(gè)用來(lái)合成的值。當(dāng)所有的像素都是對(duì)齊的時(shí)候趣竣,GPU 只剩下很少的工作要做摇庙。

離屏渲染

1.什么是離屏渲染

On-Screen Rendering
意為當(dāng)前屏幕渲染,指的是GPU的渲染操作是在當(dāng)前用于顯示的屏幕緩沖區(qū)中進(jìn)行遥缕。

Off-Screen Rendering
意為離屏渲染卫袒,指的是GPU在當(dāng)前屏幕緩沖區(qū)以外新開辟一個(gè)緩沖區(qū)進(jìn)行渲染操作。

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

離屏渲染可以被 Core Animation 自動(dòng)觸發(fā)码秉,或者被應(yīng)用程序強(qiáng)制觸發(fā)逮矛。屏幕外的渲染會(huì)合并/渲染圖層樹的一部分到一個(gè)新的緩沖區(qū),然后該緩沖區(qū)被渲染到屏幕上转砖。

這里提到的offscreen rendering主要講的是通過(guò)GPU執(zhí)行的offscreen,事實(shí)上還有的offscreen rendering是通過(guò)CPU來(lái)執(zhí)行的橱鹏。

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

2.為什么要謹(jǐn)慎避免離屏渲染

離屏渲染主要在兩個(gè)地方開銷較大:
創(chuàng)建新緩沖區(qū)
要想進(jìn)行離屏渲染,首先要?jiǎng)?chuàng)建一個(gè)新的緩沖區(qū)模捂。
上下文切換
離屏渲染的整個(gè)過(guò)程捶朵,需要多次切換上下文環(huán)境:先是從當(dāng)前屏幕(On-Screen)切換到離屏(Off-Screen);等到離屏渲染結(jié)束以后狂男,將離屏緩沖區(qū)的渲染結(jié)果顯示到屏幕上有需要將上下文環(huán)境從離屏切換到當(dāng)前屏幕综看。而上下文環(huán)境的切換是要付出很大代價(jià)的。

3.一些觸發(fā)離屏渲染的方式

設(shè)置了以下屬性時(shí)岖食,都會(huì)觸發(fā)離屏繪制:
shouldRasterize(光柵化)
masks(遮罩)
shadows(陰影)
edge antialiasing(抗鋸齒)
group opacity(不透明)

PS:光柵化

在CALayer中红碑,設(shè)置shouldRasterize = YES便會(huì)觸發(fā)光柵化,且會(huì)將光柵化后的內(nèi)容緩存起來(lái)泡垃。相當(dāng)于光柵化是把GPU的操作轉(zhuǎn)到CPU上了析珊,生成位圖緩存,直接讀取復(fù)用蔑穴。因?yàn)殡x屏渲染本身開銷較大忠寻,所以對(duì)于是否需要光柵化,應(yīng)該因地制宜地使用存和。且系統(tǒng)設(shè)置了對(duì)這個(gè)光柵化的內(nèi)存使用限制奕剃,有兩點(diǎn)需要注意:

不要過(guò)度使用,系統(tǒng)限制了緩存的大小為2.5X Screen Size.如果過(guò)度使用,超出緩存之后,同樣會(huì)造成大量的offscreen渲染。

被光柵化的圖片如果超過(guò)100ms沒有被使用,則會(huì)被移除
因此我們應(yīng)該只對(duì)連續(xù)不斷使用的圖片進(jìn)行緩存捐腿。對(duì)于不常使用的圖片緩存是沒有意義,且耗費(fèi)資源的纵朋。

對(duì)于那些需要?jiǎng)赢嫸乙谄聊煌怃秩镜膱D層來(lái)說(shuō),你可以用CAShapeLayer叙量,contentsCenter或者shadowPath來(lái)獲得同樣的表現(xiàn)而且較少地影響到性能

小結(jié):

在上一章中倡蝙。我們已經(jīng)知道了影響界面卡頓的主要原因是在一個(gè) VSync 時(shí)間內(nèi),CPU 或者 GPU 沒有完成內(nèi)容提交绞佩,則那一幀就會(huì)被丟棄寺鸥。所以猪钮,我們要盡可能的節(jié)約CPU,GPU的開銷胆建。在知道本文中講述的影響渲染性能的關(guān)鍵點(diǎn)以后烤低,開發(fā)中就可以注意使用相關(guān)功能來(lái)減少對(duì)CPU/GPU的開銷。

參考文章:
iOS 保持界面流暢的技巧
iOS圖形原理與離屏渲染
iOS 事件處理機(jī)制與圖像渲染過(guò)程

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末笆载,一起剝皮案震驚了整個(gè)濱河市扑馁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌凉驻,老刑警劉巖腻要,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異涝登,居然都是意外死亡雄家,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門胀滚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)趟济,“玉大人,你說(shuō)我怎么就攤上這事咽笼∏瓯啵” “怎么了?”我有些...
    開封第一講書人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵剑刑,是天一觀的道長(zhǎng)媳纬。 經(jīng)常有香客問(wèn)我,道長(zhǎng)叛甫,這世上最難降的妖魔是什么层宫? 我笑而不...
    開封第一講書人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任杨伙,我火速辦了婚禮其监,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘限匣。我一直安慰自己抖苦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開白布米死。 她就那樣靜靜地躺著锌历,像睡著了一般。 火紅的嫁衣襯著肌膚如雪峦筒。 梳的紋絲不亂的頭發(fā)上究西,一...
    開封第一講書人閱讀 49,985評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音物喷,去河邊找鬼卤材。 笑死遮斥,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的扇丛。 我是一名探鬼主播术吗,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼帆精!你這毒婦竟也來(lái)了较屿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤卓练,失蹤者是張志新(化名)和其女友劉穎隘蝎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體襟企,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡末贾,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了整吆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拱撵。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖表蝙,靈堂內(nèi)的尸體忽然破棺而出拴测,到底是詐尸還是另有隱情,我是刑警寧澤府蛇,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布集索,位于F島的核電站,受9級(jí)特大地震影響汇跨,放射性物質(zhì)發(fā)生泄漏务荆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一穷遂、第九天 我趴在偏房一處隱蔽的房頂上張望函匕。 院中可真熱鬧,春花似錦蚪黑、人聲如沸盅惜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)抒寂。三九已至,卻和暖如春掠剑,著一層夾襖步出監(jiān)牢的瞬間屈芜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工朴译, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留井佑,地道東北人糕珊。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像毅糟,于是被迫代替她去往敵國(guó)和親红选。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350

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

  • 圓角是一種很常見的視圖效果姆另,相比于直角喇肋,它更加柔和優(yōu)美,易于接受迹辐。設(shè)置圓角會(huì)帶來(lái)一定的性能損耗蝶防,如何提高性能是一個(gè)...
    Chars閱讀 552評(píng)論 0 8
  • 繪制像素到屏幕上 answer-huang22 Mar 2014 分享文章 一個(gè)像素是如何繪制到屏幕上去的?有很多...
    阿貍旅途T恤閱讀 1,629評(píng)論 0 7
  • 像素是如何顯示在屏幕上的呢明吩? 當(dāng)然這里有很多種方式將某些東西顯示到顯示器上面间学,并且它們可能涉及到許多不同的fram...
    樗同學(xué)閱讀 1,769評(píng)論 1 3
  • 繪制像素到屏幕上 軟件組成 從簡(jiǎn)單的角度來(lái)看, 軟件堆棧看起來(lái)有點(diǎn)像這樣: Display的上一層便是圖形處理單元...
    VanChan閱讀 832評(píng)論 0 1
  • 卷首語(yǔ) 歡迎來(lái)到 objc.io 的第三期印荔! 這一期都是關(guān)于視圖層的低葫。當(dāng)然視圖層有很多方面,我們需要把它們縮小到幾...
    評(píng)評(píng)分分閱讀 1,757評(píng)論 0 18