Instruments性能優(yōu)化-Core Animation

當(dāng)App發(fā)展到一定的規(guī)模,性能優(yōu)化就成為必不可少的一點(diǎn)碎乃。但是很多人姊扔,又對性能優(yōu)化很陌生,畢竟平常大多時間都在寫業(yè)務(wù)邏輯梅誓,很少關(guān)注這個恰梢。最近在優(yōu)化自己的項(xiàng)目,也收集了很多資料梗掰,這里先淺談一下使用Instruments中CoreAnimation優(yōu)化收獲的經(jīng)驗(yàn)以及總結(jié)删豺,這是第一篇,后續(xù)會更新Timer Profiler,Leaks等其他優(yōu)化工具的具體用法愧怜。

準(zhǔn)備工作

在性能優(yōu)化中一個最具參考價值的屬性是FPS:全稱Frames Per Second,其實(shí)就是屏幕刷新率呀页,蘋果的iphone推薦的刷新率是60Hz,也就是說GPU每秒鐘刷新屏幕60次拥坛,這每刷新一次就是一幀frame蓬蝶,F(xiàn)PS也就是每秒鐘刷新多少幀畫面。靜止不變的頁面FPS值是0猜惋,這個值是沒有參考意義的丸氛,只有當(dāng)頁面在執(zhí)行動畫或者滑動的時候,F(xiàn)PS值才具有參考價值著摔,F(xiàn)PS值的大小體現(xiàn)了頁面的流暢程度高低缓窜,當(dāng)?shù)陀?5的時候卡頓會比較明顯。
注意點(diǎn):
(1)使用真機(jī)調(diào)試。
(2)最好使用release包測試(release是發(fā)布版本禾锤,蘋果會在release包中做很多優(yōu)化工作私股,因此用release包測試出來的性能才是最真實(shí)的)巍虫。

啟動程序點(diǎn)擊XCode選擇左上角-XCode->Open Developer Tool ->Instruments纺蛆,打開Instruments再選擇CoreAnimation:

打開CoreAnimation

CoreAnimation調(diào)試界面
圖中1是FPS值呛每。
圖中2是不同緯度的調(diào)試選項(xiàng)(下面會逐個介紹)锌奴。

Color Blended Layers (圖層混合)

這個選項(xiàng)是檢測哪里發(fā)生了圖層混合,先介紹一下什么是圖層混合伶贰?很多情況下涂身,界面都是會出現(xiàn)多個UI控件疊加的情況泊窘,如果有透明或者半透明的控件逼争,那么GPU會去計算這些這些layer最終的顯示的顏色优床,也就是我們?nèi)庋鬯吹降男Ч@缫粋€上層Veiw顏色是綠色RGB(0,255,0)誓焦,下層又放了一個View顏色是紅色RGB(0,0,255)羔巢,透明度是50%,那么最終顯示到我們眼前的顏色是藍(lán)色RGB(0,127.5,127.5)罩阵。這個計算過程會消耗一定的GPU資源損耗性能。如果我們把上層的綠色View改為不透明启摄, 那么GPU就不用耗費(fèi)資源計算稿壁,直接顯示綠色∏副福混合顏色計算公式:

R(C)=alpha*R(B)+(1-alpha)*R(A)    R(x)傅是、G(x)、B(x)分別指顏色x的RGB分量

如果出現(xiàn)圖層混合了蕾羊,打開Color Blended Layers選項(xiàng)喧笔,那塊區(qū)域會顯示紅色,所以我們調(diào)試的目的就是將紅色區(qū)域消減的越少越好龟再。那么如何減少紅色區(qū)域的出現(xiàn)呢书闸?只要設(shè)置控件不透明即可。
(1)設(shè)置opaque 屬性為NO利凑。
(2)給View設(shè)置一個不透明的顏色浆劲,沒有特殊需要設(shè)置白色即可。
如果你在lldb中po打印某個控件哀澈,你會發(fā)現(xiàn)打印出來的數(shù)據(jù)中牌借,控件的opaque都是NO,因?yàn)榭丶@個屬性的默認(rèn)值都是NO割按,所以第一種方法可以直接忽略掉膨报。使用第二種方法你會發(fā)現(xiàn)之前紅色的都消除掉了。


設(shè)置不透明之前

設(shè)置不透明之后
label.backgroundColor = [UIColor whiteColor];
label.layer.masksToBounds = YES;

到這里你可能奇怪,設(shè)置label的背景色第一行不就夠了么现柠,為什么還有第二行院领?這是因?yàn)槿绻鹟abel的內(nèi)容是中文,label實(shí)際渲染區(qū)域要大于label的size晒旅,最外層多了一個sublayer栅盲,如果不設(shè)置第二行l(wèi)abel的邊緣外層灰出現(xiàn)圖層混合的紅色,因此需要在label內(nèi)容是中文的情況下加第二句废恋。單獨(dú)使用label.layer.masksToBounds = YES是不會發(fā)生離屏渲染谈秫,下文會講離屏渲染。
注意點(diǎn):UIImageView控件比較特殊鱼鼓,不僅需要自身這個容器是不透明的拟烫,并且imageView包含的內(nèi)容圖片也必須是不透明的,如果你自己的圖片出現(xiàn)了圖層混合紅色迄本,先檢查是不是自己的代碼有問題硕淑,如果確認(rèn)代碼沒問題,就是圖片自身的問題嘉赎,可以聯(lián)系你們的UI眉眉~

Color Hits Green and Misses Red(光柵化)

這個選項(xiàng)主要是檢測我們是是否正確使用layer的shouldRasterize屬性置媳,shouldRasterize = YES開啟光柵化。什么是光柵化公条?光柵化是將一個layer預(yù)先渲染成位圖(bitmap)拇囊,再加入到緩存中,成功被緩存的layer會標(biāo)注為綠色,沒有成功緩存的會標(biāo)注為紅色靶橱,正確使用光柵化可以得到一定程度的性能提升寥袭。
適用情況:一般在圖像內(nèi)容不變的情況下才使用光柵化,例如設(shè)置陰影耗費(fèi)資源比較多的靜態(tài)內(nèi)容关霸,如果使用光柵化對性能的提升有一定幫助传黄。
非適用情況:如果內(nèi)容會經(jīng)常變動,這個時候不要開啟,否則會造成性能的浪費(fèi)。例如我們在使用tableViewCell中队寇,一般不要用光柵化膘掰,因?yàn)閠ableViewCell的繪制非常頻繁,內(nèi)容在不斷的變化佳遣,如果使用了光柵化炭序,會造成大量的離屏渲染降低性能。
如果你在一個界面中使用了光柵化苍日,剛進(jìn)去這個頁面的所有使用了光柵化的控件layer都會是紅色惭聂,因?yàn)檫€沒有緩存成功,如果上下滑動你會發(fā)現(xiàn)相恃,layer變成了綠色辜纲。但是如果你滑動幅度較大會發(fā)現(xiàn),新出現(xiàn)的控件會是紅色然后變成綠色,因?yàn)閯傞_始這些控件的layer還沒有緩存耕腾。
注意點(diǎn):
(1)系統(tǒng)給光柵化緩存分配了一個固定的大小见剩,因此不能過度使用,如果超出了緩存也會造成離屏渲染扫俺。
(2)緩存的時間為100ms苍苞,因此如果在100ms內(nèi)沒有使用緩存的對象,則會從緩存中清除狼纬。

Color Copied Images(圖片顏色格式)

Shows images that are copied by Core Animation in blue蘋果官方注釋被拷貝給CPU進(jìn)行轉(zhuǎn)化的圖片顯示為綠色羹呵。那么這句話怎么理解呢?如果GPU不支持當(dāng)前圖片的顏色格式疗琉,那么就會將圖片交給CPU預(yù)先進(jìn)行格式轉(zhuǎn)化冈欢,并且這張圖片標(biāo)記為藍(lán)色。那么GPU支持什么格式呢盈简?蘋果的GPU只解析32bit的顏色格式凑耻,如果使用Color Copied Images去調(diào)試發(fā)現(xiàn)是藍(lán)色,這個時候你也可以去找你們的UI眉眉了~
知識擴(kuò)展:32bit指的是圖片顏色深度柠贤,用“位”來表示香浩,用來表示顯示顏色數(shù)量,例如一個圖片支持256種顏色臼勉,那么就需要256個不同的值來表示不同的顏色邻吭,也就是從0到255,二進(jìn)制表示就是從00000000到11111111坚俗,一共需要8位二進(jìn)制數(shù),所以顏色深度是8岸裙。通常32bit色彩中使用三個8bit分別表示R紅G綠B藍(lán),還有一個8bit常用來表示透明度(Alpha)猖败。

Color Non-Standard Surface Formats (不標(biāo)準(zhǔn)的表面顏色格式)

這個調(diào)試選項(xiàng)沒有一篇博文講過,都是直接略過降允,我也嘗試很多途徑去找這個選項(xiàng)到底是什么作用恩闻,然而蘋果開發(fā)文檔以及stackOverFlow都沒有對這個有所解釋。自己真機(jī)調(diào)試嘗試了很多發(fā)現(xiàn)有個規(guī)律剧董,就是打開這個選項(xiàng)幢尚,某些Label和Button的背景顏色都會出現(xiàn)銀白色,但是不是必先現(xiàn)的翅楼,有些Label和Button依然正常顏色背景尉剩。其他ImageView等控件是不會出現(xiàn)銀白色的背景顏色,猜想是不是和文本Text的設(shè)置有關(guān)系毅臊。如果您對這個有所了解理茎,歡迎討論。


Color Non-Standard Surface Formats調(diào)試效果

Color Immediately(顏色刷新頻率)

當(dāng)執(zhí)行顏色刷新的時候移除10ms的延遲,因?yàn)榭赡茉谔囟ㄇ闆r下你不需要這些延遲皂林,所以使用此選項(xiàng)加快顏色刷新的頻率朗鸠。不過一般這個調(diào)試選項(xiàng)我們是用不到的。

Color Misaligned Images(圖片大小)

這個選項(xiàng)可以幫助我們查看圖片大小是否正確顯示础倍。如果image size和imageView size不匹配烛占,image會出現(xiàn)黃色。要盡可能的減少黃色的出現(xiàn)沟启,因?yàn)閕mage size與imageView size不匹配忆家,會消耗資源壓縮圖片。下圖中的image實(shí)際size(81美浦,110)弦赖,頂部image正常,底部image出現(xiàn)黃色因?yàn)榉旁诹艘粋€size x 2的imageView容器中浦辨。


Color Misaligned Images調(diào)試效果圖

Color Offscreen-Rendered Yellow(離屏渲染)

離屏渲染Off-Screen Rendering 指的是GPU在當(dāng)前屏幕緩沖區(qū)以外新開辟一個緩沖區(qū)進(jìn)行渲染操作蹬竖。還有另外一種屏幕渲染方式-當(dāng)前屏幕渲染On-Screen Rendering ,指的是GPU的渲染操作是在當(dāng)前用于顯示的屏幕緩沖區(qū)中進(jìn)行流酬。 離屏渲染會先在屏幕外創(chuàng)建新緩沖區(qū)币厕,離屏渲染結(jié)束后,再從離屏切到當(dāng)前屏幕芽腾, 把離屏的渲染結(jié)果顯示到當(dāng)前屏幕上旦装,這個上下文切換的過程是非常消耗性能的,實(shí)際開發(fā)中盡可能避免離屏渲染摊滔。
觸發(fā)離屏渲染Offscreen rendering的行為:
(1)drawRect:方法
(2)layer.shadow
(3)layer.allowsGroupOpacity or layer.allowsEdgeAntialiasing
(4)layer.shouldRasterize
(5)layer.mask
(6)layer.masksToBounds && layer.cornerRadius
這里有需要注意的是第三條layer.shouldRasterize 阴绢,其實(shí)就是我們本文講的第三個選項(xiàng)光柵化,光柵化會觸發(fā)離屏渲染艰躺,因此光柵化慎用呻袭。
第六條設(shè)置圓角會觸發(fā)離屏渲染,如果在某個頁面大量使用了圓角腺兴,會非常消耗性能造成FPS急劇下降左电,設(shè)置圓角觸發(fā)離屏渲染要同時滿足下面兩個條件:

layer.masksToBounds = YES;
layer.cornerRadius = 5;

下圖是給一個label設(shè)置了圓角,觸發(fā)離屏渲染:

離屏渲染效果圖.jpg
為了盡可能避免觸發(fā)離屏渲染页响,我們可以換其他手段來實(shí)現(xiàn)必要的功能:
(1)陰影繪制shadow:使用ShadowPath來替代shadowOffset等屬性的設(shè)置
imageViewLayer.shadowPath = CGPathCreateWithRect(imageRect, NULL);
(2)利用GraphicsContex生成一張帶圓角的圖片或者view篓足,這里不寫具體實(shí)現(xiàn)過程,需要的可以度娘Copy闰蚕,很多現(xiàn)成的代碼栈拖。

Color Compositing Fast-Path Blue (快速路徑)

Places a blue overlay over content that is detached from the compositor.標(biāo)記由硬件繪制的路徑為藍(lán)色,藍(lán)色越多越好没陡,可以對直接使用OpenGL繪制的圖層進(jìn)行高亮辱魁。沒有對OpenGL有過多的研究烟瞧,所以這里沒辦法給出demo,大家只需要記住藍(lán)色越多越好就ok染簇。

Flash Updated Regions (重繪區(qū)域)

Colors regions on your iOS device in yellow when those regions are updated by the graphics processor.這個選項(xiàng)會對重繪的內(nèi)容高亮成黃色,重繪就是指使用Core Graphics繪制参滴,繪制會損耗一定的性能,因此重繪區(qū)域應(yīng)該越小越好锻弓。下圖是用真機(jī)進(jìn)入原生地圖開啟Flash Updated Regions 調(diào)試的效果圖砾赔,很可惜截屏不能截到黃色的區(qū)域,因此我用紅框圈起來青灼,一共兩處暴心,坐上角的是在不停的刷新頁面,右下角是在不停的刷新當(dāng)前位置杂拨,因此都是使用Core Graphics重繪刷新的一種場景专普,并且你可以發(fā)現(xiàn)黃色區(qū)域很小,區(qū)域越小性能越好弹沽。


Flash Updated Regions開啟地圖效果圖

好了檀夹,花了幾天的精力終于寫完了~對Core Animation的全部調(diào)試選項(xiàng)也都講解了,如果你能在項(xiàng)目中合理使用策橘,對App的性能提升一定不可小覷炸渡。當(dāng)然這是針對試圖的調(diào)試方式,功能代碼的設(shè)計是否合理也是影響性能很重要的一方面丽已。
本人才疏學(xué)淺蚌堵,如有疏漏敬請評論指正,一塊學(xué)習(xí)進(jìn)步沛婴,如果您對覺得對您有幫助歡迎點(diǎn)個贊哈~謝謝吼畏。iOS開發(fā)技術(shù)交流qq群: 529560119,提供各種最新權(quán)威學(xué)習(xí)書籍及開發(fā)視頻

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嘁灯,一起剝皮案震驚了整個濱河市泻蚊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌旁仿,老刑警劉巖藕夫,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件孽糖,死亡現(xiàn)場離奇詭異枯冈,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)办悟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門尘奏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人病蛉,你說我怎么就攤上這事炫加」寮澹” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵俗孝,是天一觀的道長酒甸。 經(jīng)常有香客問我,道長赋铝,這世上最難降的妖魔是什么插勤? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮革骨,結(jié)果婚禮上农尖,老公的妹妹穿的比我還像新娘。我一直安慰自己良哲,他們只是感情好盛卡,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著筑凫,像睡著了一般滑沧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上漏健,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天嚎货,我揣著相機(jī)與錄音,去河邊找鬼蔫浆。 笑死殖属,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瓦盛。 我是一名探鬼主播洗显,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼原环!你這毒婦竟也來了挠唆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤嘱吗,失蹤者是張志新(化名)和其女友劉穎玄组,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谒麦,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡俄讹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了绕德。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片患膛。...
    茶點(diǎn)故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖耻蛇,靈堂內(nèi)的尸體忽然破棺而出踪蹬,到底是詐尸還是另有隱情胞此,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布跃捣,位于F島的核電站漱牵,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏疚漆。R本人自食惡果不足惜布疙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望愿卸。 院中可真熱鬧灵临,春花似錦、人聲如沸趴荸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽发钝。三九已至顿涣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間酝豪,已是汗流浹背涛碑。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留孵淘,地道東北人蒲障。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像瘫证,于是被迫代替她去往敵國和親揉阎。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評論 2 345

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