iOS開發(fā)——影響圖形性能的因素以及檢測(cè)方法

我想各位攻城獅們肯定聽過一句話:“過早的優(yōu)化是萬惡之源”。若是你有著豐富的項(xiàng)目經(jīng)驗(yàn)梢褐,一定會(huì)對(duì)這句話有著自己的體會(huì),而若是編程新手赵讯,那么盈咳,請(qǐng)牢記這句話。在一個(gè)項(xiàng)目開發(fā)到后期边翼,優(yōu)化就會(huì)成為一個(gè)不可避免的話題鱼响,而這時(shí),優(yōu)化以及性能問題又顯得尤為重要组底。

本文討論的是iOS的圖形性能問題丈积。

影響性能的因素

1、 CALayershouldRasterize(光柵化)

這個(gè)屬性看上去很不好理解债鸡,光柵化是將幾何數(shù)據(jù)經(jīng)過一系列變換后最終轉(zhuǎn)換為像素江滨,從而呈現(xiàn)在顯示設(shè)備上的過程。光柵化的本質(zhì)是坐標(biāo)變換厌均、幾何離散化唬滑。

layershouldRasterize設(shè)為YES后,CALayer會(huì)被光柵化為bitmap棺弊,layer的陰影等效果也會(huì)被保存到bitmap中作為緩存晶密。在使用了shadowcornerRadius等效果時(shí),緩存使性能得到提升模她。

但是在使用這個(gè)屬性前稻艰,需要明確3點(diǎn):

  • 更新已經(jīng)光柵化的CALayer會(huì)造成離屏渲染

  • 被光柵化的bitmap如果超過100ms沒有被使用則會(huì)被移除

  • 系統(tǒng)限制緩存的大小為2.5 x screen size

2、Offscreen rendering(離屏渲染)

討論造成離屏渲染的原因之前缝驳,先說明什么是離屏渲染:離屏渲染指的是在圖像在繪制到當(dāng)前屏幕前,需要先進(jìn)行一次渲染,之后才繪制到當(dāng)前屏幕连锯。在第一次渲染時(shí)归苍,GPU(Core Animation)CPU(Core Graphics)需要額外的一塊內(nèi)存來進(jìn)行渲染用狱,完成后再繪制到屏幕。offscreenonscreen需要進(jìn)行上下文切換拼弃,這個(gè)切換的性能消耗是昂貴的夏伊。

因此,我們必須避免不必要的離屏渲染吻氧。

造成離屏渲染的原因有:

  • 設(shè)置CALayercornerRadiu溺忧,edgeAntialiasingMask咏连,allowsEdgeAntialiasing屬性
  • CALayermaskToBounds設(shè)為YES
  • 設(shè)置CALayershadow屬性
  • 設(shè)置CALayermask屬性
  • CALayerallowsGroupOpacity屬性設(shè)為YES而且opacity小于1

等等...

由此可見,很多常用屬性都會(huì)造成離屏渲染鲁森,在性能要求高的地方祟滴,就需要使用另外的實(shí)現(xiàn)方案。比如使用shadowPath代替使用shadow+shadowOffset+shadowColor歌溉;在需要使用圓形圖片的tableview里垄懂,使用cornerRadius設(shè)置圓角是下下之選,可以用一張中間為透明圓形的圖片進(jìn)行遮蓋來達(dá)到圓形的效果痛垛,或者在使用前就把圖片裁剪為圓形草慧。

3、Blending(混合繪制)

GPU會(huì)放棄繪制那些完全被其他圖層遮蓋的內(nèi)容匙头。如果兩個(gè)圖層疊加在一起漫谷,上面的圖層不是完全不透明的,那么GPU便會(huì)計(jì)算合并兩個(gè)圖層的透明重疊像素蹂析,這個(gè)過程便是blending舔示,這同樣也是一個(gè)消耗資源的過程。

因此电抚,不要隨便把一個(gè)視圖或圖層的backgroundColor設(shè)為透明斩郎。

使用Instrument進(jìn)行檢查

Xcode打開你的項(xiàng)目,選擇工具欄上的Product->Profile喻频,編譯成功后會(huì)打開Instrument缩宜,在Choose a profile template頁面下選擇Core Animation,進(jìn)入主界面甥温。(如果需要檢測(cè)動(dòng)畫幀數(shù)锻煌,需要使用真機(jī))

點(diǎn)擊左上方紅色的錄制按鈕,開始檢測(cè):

在頁面右下方姻蚓,有一系列的復(fù)選框宋梧,利用這幾個(gè)選項(xiàng),我們可以很輕松的檢查上面所提到的問題:(下面解釋摘抄自iOS核心動(dòng)畫高級(jí)技巧第十二章)

  • Color Blended Layers - 這個(gè)選項(xiàng)基于渲染程度對(duì)屏幕中的混合區(qū)域進(jìn)行綠到紅的高亮(也就是多個(gè)半透明圖層的疊加)狰挡。由于重繪的原因捂龄,混合對(duì)GPU性能會(huì)有影響,同時(shí)也是滑動(dòng)或者動(dòng)畫幀率下降的罪魁禍?zhǔn)字弧?/p>

  • ColorHitsGreenandMissesRed - 當(dāng)使用shouldRasterizep屬性的時(shí)候加叁,耗時(shí)的圖層繪制會(huì)被緩存倦沧,然后當(dāng)做一個(gè)簡(jiǎn)單的扁平圖片呈現(xiàn)。當(dāng)緩存再生的時(shí)候這個(gè)選項(xiàng)就用紅色對(duì)柵格化圖層進(jìn)行了高亮它匕。如果緩存頻繁再生的話展融,就意味著柵格化可能會(huì)有負(fù)面的性能影響了。

  • Color Copied Images - 有時(shí)候寄宿圖片的生成意味著Core Animation被強(qiáng)制生成一些圖片豫柬,然后發(fā)送到渲染服務(wù)器告希,而不是簡(jiǎn)單的指向原始指針扑浸。這個(gè)選項(xiàng)把這些圖片渲染成藍(lán)色。復(fù)制圖片對(duì)內(nèi)存和CPU使用來說都是一項(xiàng)非常昂貴的操作燕偶,所以應(yīng)該盡可能的避免喝噪。

  • Color Immediately - 通常Core Animation Instruments以每毫秒10次的頻率更新圖層調(diào)試顏色。對(duì)某些效果來說指么,這顯然太慢了仙逻。這個(gè)選項(xiàng)就可以用來設(shè)置每幀都更新(可能會(huì)影響到渲染性能,而且會(huì)導(dǎo)致幀率測(cè)量不準(zhǔn)涧尿,所以不要一直都設(shè)置它)系奉。

  • Color Misaligned Images - 這里會(huì)高亮那些被縮放或者拉伸以及沒有正確對(duì)齊到像素邊界的圖片(也就是非整型坐標(biāo))。這些中的大多數(shù)通常都會(huì)導(dǎo)致圖片的不正彻昧縮放缺亮,如果把一張大圖當(dāng)縮略圖顯示,或者不正確地模糊圖像桥言,那么這個(gè)選項(xiàng)將會(huì)幫你識(shí)別出問題所在萌踱。

  • Color Offscreen-Rendered Yellow - 這里會(huì)把那些需要離屏渲染的圖層高亮成黃色。這些圖層很可能需要用shadowPath或者shouldRasterize來優(yōu)化号阿。

  • Color OpenGL Fast Path Blue - 這個(gè)選項(xiàng)會(huì)對(duì)任何直接使用OpenGL繪制的圖層進(jìn)行高亮并鸵。如果僅僅使用UIKit或者Core Animation的API,那么不會(huì)有任何效果扔涧。如果使用GLKView或者CAEAGLLayer园担,那如果不顯示藍(lán)色塊的話就意味著你正在強(qiáng)制CPU渲染額外的紋理,而不是繪制到屏幕枯夜。

  • Flash Updated Regions - 這個(gè)選項(xiàng)會(huì)對(duì)重繪的內(nèi)容高亮成黃色(也就是任何在軟件層面使用Core Graphics繪制的圖層)弯汰。這種繪圖的速度很慢。如果頻繁發(fā)生這種情況的話湖雹,這意味著有一個(gè)隱藏的bug或者說通過增加緩存或者使用替代方案會(huì)有提升性能的空間咏闪。

需要注意的重點(diǎn)是這3個(gè):

  • Color Blended Layers

勾選后,檢查你的應(yīng)用界面摔吏,blended layer會(huì)顯示為紅色鸽嫂,不透明的為綠色,紅色越少越好征讲,如果你的界面一片紅海据某,那就是時(shí)候好好優(yōu)化了。

  • ColorHitsGreenandMissesRed

勾選后稳诚,如果在你使用了shouldRasterize的地方界面顯示為綠色哗脖,則表示使用正確性能良好,如果為紅色扳还,則需要考慮優(yōu)化了才避。(第一次加載時(shí)會(huì)顯示紅色,因?yàn)檫@時(shí)還沒緩存成功氨距,需要檢測(cè)重用的過程中(比如tableview上下滾動(dòng))的變化)

  • Color Offscreen-Rendered Yellow

如上所述桑逝,離屏渲染的地方都標(biāo)記為黃色。并非所有的黃色區(qū)域都是需要優(yōu)化的俏让,比如UINavigationBar楞遏,因?yàn)樾枰霰尘澳:Ч虼怂枰x屏渲染首昔。

總結(jié)

上述的很多原因分析寡喝,希望大家不要有強(qiáng)迫癥的感覺,要求自己的所有項(xiàng)目必須按這個(gè)標(biāo)準(zhǔn)執(zhí)行勒奇,因?yàn)檫@是不可能的预鬓,只是給大家提供一個(gè)優(yōu)化方向,以及出了性能問題以后的分析依據(jù)赊颠。但是在日常的編碼過程中格二,也要時(shí)刻把性能的意識(shí)放在心上,寫出優(yōu)秀的代碼竣蹦。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末顶猜,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子痘括,更是在濱河造成了極大的恐慌长窄,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,627評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纲菌,死亡現(xiàn)場(chǎng)離奇詭異抄淑,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)驰后,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門肆资,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人灶芝,你說我怎么就攤上這事郑原。” “怎么了夜涕?”我有些...
    開封第一講書人閱讀 169,346評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵犯犁,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我女器,道長(zhǎng)酸役,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,097評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮涣澡,結(jié)果婚禮上贱呐,老公的妹妹穿的比我還像新娘。我一直安慰自己入桂,他們只是感情好奄薇,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著抗愁,像睡著了一般馁蒂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蜘腌,一...
    開封第一講書人閱讀 52,696評(píng)論 1 312
  • 那天沫屡,我揣著相機(jī)與錄音,去河邊找鬼撮珠。 笑死沮脖,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的劫瞳。 我是一名探鬼主播倘潜,決...
    沈念sama閱讀 41,165評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼志于!你這毒婦竟也來了涮因?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,108評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤伺绽,失蹤者是張志新(化名)和其女友劉穎养泡,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奈应,經(jīng)...
    沈念sama閱讀 46,646評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡诸迟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評(píng)論 3 342
  • 正文 我和宋清朗相戀三年跃脊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蠢沿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片垮抗。...
    茶點(diǎn)故事閱讀 40,861評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖惩妇,靈堂內(nèi)的尸體忽然破棺而出株汉,到底是詐尸還是另有隱情,我是刑警寧澤歌殃,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布乔妈,位于F島的核電站,受9級(jí)特大地震影響氓皱,放射性物質(zhì)發(fā)生泄漏路召。R本人自食惡果不足惜勃刨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望股淡。 院中可真熱鬧身隐,春花似錦、人聲如沸揣非。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽早敬。三九已至,卻和暖如春大脉,著一層夾襖步出監(jiān)牢的瞬間搞监,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工镰矿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留琐驴,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,287評(píng)論 3 379
  • 正文 我出身青樓秤标,卻偏偏與公主長(zhǎng)得像绝淡,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子苍姜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評(píng)論 2 361

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