15 性能優(yōu)化(二)Core Animation

向原創(chuàng)作者致敬 : http://www.cocoachina.com/ios/20161211/18341.html

啟動程序點擊XCode選擇左上角-XCode->Open Developer Tool ->Instruments妒蛇,打開Instruments再選擇CoreAnimation:


1是fps ?2是調(diào)試選項

調(diào)試選項介紹:

選項一:Color Blended Layers (圖層混合)

這個選項是檢測哪里發(fā)生了圖層混合措伐,先介紹一下什么是圖層混合赏廓?很多情況下抬纸,界面都是會出現(xiàn)多個UI控件疊加的情況,如果有透明或者半透明的控件徘意,那么GPU會去計算這些這些layer最終的顯示的顏色车摄,也就是我們?nèi)庋鬯吹降男Ч@缫粋€上層Veiw顏色是綠色RGB(0,255,0),下層又放了一個View顏色是紅色RGB(0,0,255)抖部,透明度是50%说贝,那么最終顯示到我們眼前的顏色是藍色RGB(0,127.5,127.5)。這個計算過程會消耗一定的GPU資源損耗性能慎颗。如果我們把上層的綠色View改為不透明乡恕, 那么GPU就不用耗費資源計算,直接顯示綠色俯萎“烈耍混合顏色計算公式:

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

如果出現(xiàn)圖層混合了函卒,打開Color Blended Layers選項,那塊區(qū)域會顯示紅色撇眯,所以我們調(diào)試的目的就是將紅色區(qū)域消減的越少越好硕勿。那么如何減少紅色區(qū)域的出現(xiàn)呢会涎?只要設置控件不透明即可汹族。

(1)設置opaque 屬性為true。

(2)給View設置一個不透明的顏色腕巡,沒有特殊需要設置白色即可。

如果你在lldb中po打印某個控件血筑,你會發(fā)現(xiàn)打印出來的數(shù)據(jù)中绘沉,控件的opaque都是true,因為控件這個屬性的默認值都是true豺总,所以第一種方法可以直接忽略掉车伞。使用第二種方法你會發(fā)現(xiàn)之前紅色的都消除掉了。

label.backgroundColor = [UIColor whiteColor];

label.layer.masksToBounds?=?YES;

到這里你可能奇怪园欣,設置label的背景色第一行不就夠了么帖世,為什么還有第二行?這是因為如果label的內(nèi)容是中文沸枯,label實際渲染區(qū)域要大于label的size日矫,最外層多了一個sublayer,如果不設置第二行l(wèi)abel的邊緣外層會出現(xiàn)圖層混合的紅色绑榴,因此需要在label內(nèi)容是中文的情況下加第二句哪轿。單獨使用label.layer.masksToBounds = YES是不會發(fā)生離屏渲染,下文會講離屏渲染翔怎。

UIImageView控件比較特殊窃诉,不僅需要自身這個容器是不透明的,并且imageView包含的內(nèi)容圖片也必須是不透明的赤套,如果你自己的圖片出現(xiàn)了圖層混合紅色飘痛,先檢查是不是自己的代碼有問題,如果確認代碼沒問題容握,就是圖片自身的問題宣脉,可以聯(lián)系你們的UI眉眉~

選項二:Color Hits Green and Misses Red(光柵化)

這個選項主要是檢測我們是是否正確使用layer的shouldRasterize屬性,shouldRasterize = YES開啟光柵化剔氏。什么是光柵化塑猖?光柵化是將一個layer預先渲染成位圖(bitmap),再加入到緩存中谈跛,成功被緩存的layer會標注為綠色,沒有成功緩存的會標注為紅色羊苟,正確使用光柵化可以得到一定程度的性能提升。

適用情況:一般在圖像內(nèi)容不變的情況下才使用光柵化感憾,例如設置陰影耗費資源比較多的靜態(tài)內(nèi)容蜡励,如果使用光柵化對性能的提升有一定幫助。

非適用情況:如果內(nèi)容會經(jīng)常變動,這個時候不要開啟,否則會造成性能的浪費。例如我們在使用tableViewCell中巍虫,一般不要用光柵化彭则,因為tableViewCell的繪制非常頻繁,內(nèi)容在不斷的變化占遥,如果使用了光柵化俯抖,會造成大量的離屏渲染降低性能。

如果你在一個界面中使用了光柵化瓦胎,剛進去這個頁面的所有使用了光柵化的控件layer都會是紅色芬萍,因為還沒有緩存成功,如果上下滑動你會發(fā)現(xiàn)搔啊,layer變成了綠色柬祠。但是如果你滑動幅度較大會發(fā)現(xiàn),新出現(xiàn)的控件會是紅色然后變成綠色负芋,因為剛開始這些控件的layer還沒有緩存漫蛔。

注意點:

(1)系統(tǒng)給光柵化緩存分配了一個固定的大小,因此不能過度使用旧蛾,如果超出了緩存也會造成離屏渲染莽龟。

(2)緩存的時間為100ms,因此如果在100ms內(nèi)沒有使用緩存的對象锨天,則會從緩存中清除毯盈。

選項三:Color Copied Images(圖片顏色格式)

Shows images that are copied by Core Animation in blue蘋果官方注釋被拷貝給CPU進行轉(zhuǎn)化的圖片顯示為綠色。那么這句話怎么理解呢病袄?如果GPU不支持當前圖片的顏色格式搂赋,那么就會將圖片交給CPU預先進行格式轉(zhuǎn)化,并且這張圖片標記為藍色益缠。那么GPU支持什么格式呢脑奠?蘋果的GPU只解析32bit的顏色格式,如果使用Color Copied Images去調(diào)試發(fā)現(xiàn)是藍色幅慌,這個時候你也可以去找你們的UI眉眉了~

知識擴展:32bit指的是圖片顏色深度宋欺,用“位”來表示,用來表示顯示顏色數(shù)量欠痴,例如一個圖片支持256種顏色迄靠,那么就需要256個不同的值來表示不同的顏色秒咨,也就是從0到255喇辽,二進制表示就是從00000000到11111111,一共需要8位二進制數(shù)雨席,所以顏色深度是8菩咨。通常32bit色彩中使用三個8bit分別表示R紅G綠B藍,還有一個8bit常用來表示透明度(Alpha)。

選項四:Color Non-Standard Surface Formats (不標準的表面顏色格式)

這個調(diào)試選項沒有一篇博文講過,都是直接略過抽米,我也嘗試很多途徑去找這個選項到底是什么作用特占,然而蘋果開發(fā)文檔以及stack overflow都沒有對這個有所解釋。自己真機調(diào)試嘗試了很多發(fā)現(xiàn)有個規(guī)律云茸,就是打開這個選項是目,某些Label和Button的背景顏色都會出現(xiàn)銀白色,但是不是必先現(xiàn)的标捺,有些Label和Button依然正常顏色背景懊纳。其他ImageView等控件是不會出現(xiàn)銀白色的背景顏色,猜想是不是和文本Text的設置有關系亡容。如果您對這個有所了解嗤疯,歡迎討論。


選項五:Color Immediately(顏色刷新頻率)

當執(zhí)行顏色刷新的時候移除10ms的延遲闺兢,因為可能在特定情況下你不需要這些延遲茂缚,所以使用此選項加快顏色刷新的頻率。不過一般這個調(diào)試選項我們是用不到的


選項六:Color Misaligned Images(圖片大小)

這個選項可以幫助我們查看圖片大小是否正確顯示屋谭。如果image size和imageView size不匹配脚囊,image會出現(xiàn)黃色。要盡可能的減少黃色的出現(xiàn)戴而,因為image size與imageView size不匹配凑术,會消耗資源壓縮圖片。
下圖中的image實際size(81所意,110)淮逊,頂部image正常,底部image出現(xiàn)黃色因為放在了一個size x 2的imageView容器中扶踊。

選項七:Color Offscreen-Rendered Yellow(離屏渲染)

離屏渲染Off-Screen Rendering 指的是GPU在當前屏幕緩沖區(qū)以外新開辟一個緩沖區(qū)進行渲染操作泄鹏。還有另外一種屏幕渲染方式-當前屏幕渲染On-Screen Rendering ,指的是GPU的渲染操作是在當前用于顯示的屏幕緩沖區(qū)中進行秧耗。 離屏渲染會先在屏幕外創(chuàng)建新緩沖區(qū)备籽,離屏渲染結(jié)束后,再從離屏切到當前屏幕分井, 把離屏的渲染結(jié)果顯示到當前屏幕上车猬,這個上下文切換的過程是非常消耗性能的,實際開發(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 珠闰,其實就是我們本文講的第三個選項光柵化,光柵化會觸發(fā)離屏渲染瘫辩,因此光柵化慎用伏嗜。

第六條設置圓角會觸發(fā)離屏渲染坛悉,如果在某個頁面大量使用了圓角,會非常消耗性能造成FPS急劇下降承绸,設置圓角觸發(fā)離屏渲染要同時滿足下面兩個條件:

layer.masksToBounds?=?YES;

layer.cornerRadius?=?5;

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

為了盡可能避免觸發(fā)離屏渲染,我們可以換其他手段來實現(xiàn)必要的功能:

(1)陰影繪制shadow:使用ShadowPath來替代shadowOffset等屬性的設置

imageViewLayer.shadowPath = CGPathCreateWithRect(imageRect, NULL);

(2)利用GraphicsContex生成一張帶圓角的圖片或者view军熏,這里不寫具體實現(xiàn)過程轩猩,需要的可以度娘Copy,很多現(xiàn)成的代碼荡澎。

選項八:Color Compositing Fast-Path Blue (快速路徑)

Places a blue overlay over content that is detached from the compositor.標記由硬件繪制的路徑為藍色界轩,藍色越多越好,可以對直接使用OpenGL繪制的圖層進行高亮衔瓮。沒有對OpenGL有過多的研究浊猾,所以這里沒辦法給出demo,大家只需要記住藍色越多越好就ok热鞍。

選項九:Flash Updated Regions (重繪區(qū)域)

Colors regions on your iOS device in yellow when those regions are updated by the graphics processor.這個選項會對重繪的內(nèi)容高亮成黃色,重繪就是指使用Core Graphics繪制葫慎,繪制會損耗一定的性能,因此重繪區(qū)域應該越小越好薇宠。下圖是用真機進入原生地圖開啟Flash Updated Regions 調(diào)試的效果圖偷办,很可惜截屏不能截到黃色的區(qū)域,因此我用紅框圈起來澄港,一共兩處椒涯,坐上角的是在不停的刷新頁面,右下角是在不停的刷新當前位置回梧,因此都是使用Core Graphics重繪刷新的一種場景废岂,并且你可以發(fā)現(xiàn)黃色區(qū)域很小,區(qū)域越小性能越好狱意。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末湖苞,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子详囤,更是在濱河造成了極大的恐慌财骨,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件藏姐,死亡現(xiàn)場離奇詭異隆箩,居然都是意外死亡,警方通過查閱死者的電腦和手機羔杨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門捌臊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人问畅,你說我怎么就攤上這事娃属。” “怎么了护姆?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵矾端,是天一觀的道長。 經(jīng)常有香客問我卵皂,道長秩铆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任灯变,我火速辦了婚禮殴玛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘添祸。我一直安慰自己滚粟,他們只是感情好,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布刃泌。 她就那樣靜靜地躺著凡壤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪耙替。 梳的紋絲不亂的頭發(fā)上亚侠,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機與錄音俗扇,去河邊找鬼硝烂。 笑死,一個胖子當著我的面吹牛铜幽,可吹牛的內(nèi)容都是我干的滞谢。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼除抛,長吁一口氣:“原來是場噩夢啊……” “哼爹凹!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起镶殷,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤禾酱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后绘趋,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體颤陶,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年陷遮,在試婚紗的時候發(fā)現(xiàn)自己被綠了滓走。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡帽馋,死狀恐怖搅方,靈堂內(nèi)的尸體忽然破棺而出比吭,到底是詐尸還是另有隱情,我是刑警寧澤姨涡,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布衩藤,位于F島的核電站,受9級特大地震影響涛漂,放射性物質(zhì)發(fā)生泄漏赏表。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一匈仗、第九天 我趴在偏房一處隱蔽的房頂上張望瓢剿。 院中可真熱鬧,春花似錦悠轩、人聲如沸间狂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽前标。三九已至,卻和暖如春距潘,著一層夾襖步出監(jiān)牢的瞬間炼列,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工音比, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留俭尖,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓洞翩,卻偏偏與公主長得像稽犁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子骚亿,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

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