CoreAnimation用于測(cè)量應(yīng)用的圖形性能以及進(jìn)程的CPU使用率变屁。
用來(lái)監(jiān)測(cè)CoreAnimation性能。它提供了周期性的FPS意狠,并且考慮到了發(fā)生在程序之外的動(dòng)畫(huà)粟关。
FPS是指屏幕的刷新率,也就是每秒鐘顯示多少幀畫(huà)面环戈。iPhone推薦的刷新率是60Hz闷板,也就是說(shuō)在頁(yè)面執(zhí)行動(dòng)畫(huà)或者說(shuō)是滑動(dòng)的時(shí)候,每秒鐘顯示60幀的畫(huà)面院塞。頁(yè)面靜止的時(shí)候FPS值為0遮晚。FPS值的大小體現(xiàn)了頁(yè)面的流暢程度,當(dāng)FPS低于45的時(shí)候卡頓會(huì)比較明顯拦止。
注意:
(1)在使用CoreAnimation工具進(jìn)行測(cè)試的時(shí)候要使用真機(jī)來(lái)進(jìn)行測(cè)試县遣。如果選擇模擬器則會(huì)報(bào)錯(cuò)(Core Animation does not support the iOS Simulator platform)
(2)最好使用release模式
CoreAnimation常用的調(diào)試選項(xiàng)
- Color Blended Layers(圖層混合)
很多情況下,我們的界面都是會(huì)出現(xiàn)多個(gè)UI控件疊加的情況汹族,如果上層的控件是透明的或者半透明的萧求,那么GPU就會(huì)去計(jì)算這些layer最終的顯示顏色,也就是我們正扯ヂ鳎看到的效果夸政。例如上層一個(gè)UIView的背景色是藍(lán)色半透明,下層有一個(gè)紅色的UIView搁拙,GPU就會(huì)自動(dòng)計(jì)算兩個(gè)UIView重疊區(qū)域的顏色秒梳。如果我們把上層的UIView設(shè)置為不透明法绵,那么就會(huì)直接顯示為藍(lán)色,不用計(jì)算重疊部分的顏色酪碘。
如果出現(xiàn)了圖層混合朋譬,打開(kāi)Color Blended Layers
選項(xiàng),發(fā)生重疊的UIView會(huì)顯示為紅色兴垦,我們的目的是盡可能的減少紅色的區(qū)域徙赢。一般只要設(shè)置控件不透明即可,通常給控件一個(gè)不透明的背景色(例如白色)探越。
但是對(duì)于顯示的內(nèi)容有中文的Label狡赐,只設(shè)置背景色是不夠的,因?yàn)槿绻鹟abel的內(nèi)容有中文的話钦幔,label的實(shí)際渲染區(qū)域要大于label的size枕屉,最外層多了一個(gè)sublayer,需要加上label.layer.masksToBounds = YES
鲤氢。
- Color Hits Green and Misses Red(光柵化)
這個(gè)選項(xiàng)主要是檢測(cè)我們是否正確的使用了layer的shouldRasterize
屬性搀擂,shouldRasterize = YES
開(kāi)啟光柵化。光柵化是將一個(gè)layer預(yù)先渲染成位圖卷玉,再加入到緩存中哨颂,成功被緩存的layer會(huì)標(biāo)注為綠色,沒(méi)有成功緩存的會(huì)被標(biāo)注為紅色相种,正確的使用光柵化可以得到一定程度的性能提升威恼。
啟用shouldRasterize
屬性會(huì)將圖層繪制到一個(gè)屏幕之外的圖像。然后這個(gè)圖像將會(huì)被緩存起來(lái)并繪制到實(shí)際圖層的contents和子圖層寝并。如果有很多的子圖層或者有復(fù)雜的效果應(yīng)用箫措,這樣做就會(huì)比重繪所有事務(wù)的所有幀劃得來(lái)得多。但是光柵化原始圖像需要時(shí)間食茎,而且還會(huì)消耗額外的內(nèi)存蒂破。因此光柵化僅適用于較復(fù)雜的、靜態(tài)的效果别渔。例如設(shè)置陰影等耗費(fèi)資源比較多的靜態(tài)內(nèi)容附迷。如果沒(méi)有特殊的需要,關(guān)閉光柵化也是一種優(yōu)化哎媚。
- Color Misaligned Images(圖片的不正忱縮放)
這個(gè)選項(xiàng)可以幫助我們查看圖片大小是否正確顯示。如果image size和imageView size不匹配拨与,image會(huì)出現(xiàn)黃色稻据。要盡可能的減少黃色的出現(xiàn),因?yàn)閕mage size與imageView size不匹配,會(huì)消耗資源壓縮圖片捻悯。
- Color Offscreen-Rendered Yellow(離屏渲染)
離屏渲染指的是GPU在當(dāng)前屏幕緩沖區(qū)以外新開(kāi)辟一個(gè)緩沖區(qū)進(jìn)行渲染操作匆赃。還有另外一種屏幕渲染方式-當(dāng)前屏幕渲染On-Screen Rendering ,指的是GPU的渲染操作是在當(dāng)前用于顯示的屏幕緩沖區(qū)中進(jìn)行今缚。 離屏渲染會(huì)先在屏幕外創(chuàng)建新緩沖區(qū)算柳,離屏渲染結(jié)束后,再?gòu)碾x屏切到當(dāng)前屏幕姓言, 把離屏的渲染結(jié)果顯示到當(dāng)前屏幕上瞬项,這個(gè)上下文切換的過(guò)程是非常消耗性能的,實(shí)際開(kāi)發(fā)中盡可能避免離屏渲染何荚。
能夠觸發(fā)離屏渲染的行為:
(1)設(shè)置圓角(當(dāng)和maskToBounds一起使用時(shí))
(2)設(shè)置陰影
(3)layer.shouldRasterize(光柵化)
(4)layer.mask
在出現(xiàn)離屏渲染的情況下囱淋,優(yōu)先考慮避免觸發(fā)離屏渲染,設(shè)置陰影可以通過(guò)指定shadowPath來(lái)避免離屏渲染餐塘。在無(wú)法取消離屏渲染的情況下有兩種方案進(jìn)行優(yōu)化:
(1)layer.shouldRasterize(光柵化)適用于靜態(tài)內(nèi)容的視圖妥衣,對(duì)上面的所有效果而言,在實(shí)現(xiàn)成本以及性能上是最均衡的戒傻。
(2)主動(dòng)規(guī)避離屏渲染(用其他不會(huì)產(chǎn)生離屏渲染的方法實(shí)現(xiàn)效果)