iOS Instrument使用之Core Animation(图形性能)
- Core Animation圖形性能
- Debug Options
- 1Color Blended Layers 圖層混合
- 2 Color Hits Green and Misses Red 圖層緩存
- 3Color Copied Images 圖片格式檢測(cè)
- 4Color Misaligned Images 圖片尺寸是否匹配
- 5Color Offscreen-Rendered Yellow 圓角圖層蒙版陰影重繪
- 6Color Compositing Fast-Path Blue 快速路徑
- 7Flash updated Regions 重繪區(qū)域
- 8Color Immediately顏色刷新頻率
- 9Color No-Standard Surface Formats
1. Core Animation(圖形性能)
Core Animation: 離屏渲染,圖層混合等GPU耗時(shí)。
英文描述: this template measures application graphics performace as well as cpu usage of a process via time profiling
該模塊對(duì)通過(guò)時(shí)間來(lái)分析APP的圖形性能處理情況,同time profiling分析一個(gè)進(jìn)程的CPU使用情況類似
CoreAnimation系要注意的一點(diǎn)是必須是真機(jī)調(diào)試,用于調(diào)試離屏渲染,繪圖,動(dòng)畫,等操作。
2. Debug Options
1、Color Blended Layers 圖層混合
首先我們要明白像素的概念,屏幕上每一個(gè)點(diǎn)都是一個(gè)像素,像素有R、G、B三種顏色構(gòu)成(有時(shí)候還帶有alpha值)。如果某一塊區(qū)域上覆蓋了多個(gè)layer,最后的顯示效果受到這些layer的共同影響。舉個(gè)例子,上層是藍(lán)色(RGB=0,0,1),透明度為50%,下層是紅色(RGB=1,0,0)。那么最終的顯示效果是紫色(RGB=0.5,0,0.5)。這種顏色的混合(blending)需要消耗一定的GPU資源,因?yàn)閷?shí)際上可能不止只有兩層。如果只想顯示最上層的藍(lán)色,可以把它的透明度設(shè)置為100%,這樣GPU會(huì)忽略下面所有的layer,從而節(jié)約了很多不必要的運(yùn)算。<
//
這個(gè)選項(xiàng)基于渲染程度對(duì)屏幕中的混合區(qū)域進(jìn)行綠到紅的高亮(也就是多個(gè)半透明圖層的疊加)。由于重繪的原因,混合對(duì)GPU性能會(huì)有影響,同時(shí)也是滑動(dòng)或者動(dòng)畫幀率下降的罪魁禍?zhǔn)字弧?/font>
GPU每一幀可以繪制的像素有一個(gè)最大限制(就是所謂的fill rate),這個(gè)情況下可以輕易地繪制整個(gè)屏幕的所有像素。但是如果由于重疊圖層的關(guān)系需要不停地重繪同一區(qū)域的話,掉幀就可能發(fā)生了。
GPU會(huì)放棄繪制那些完全被其他圖層遮擋的像素,但是要計(jì)算出一個(gè)圖層是否被遮擋也是相當(dāng)復(fù)雜并且會(huì)消耗處理器資源。同樣,合并不同圖層的透明重疊像素(即混合)消耗的資源也是相當(dāng)客觀的。所以為了加速處理進(jìn)程,不到必須時(shí)刻不要使用透明圖層。任何情況下,你應(yīng)該這樣做:
給視圖的backgroundColor屬性設(shè)置一個(gè)固定的,不透明的顏色
設(shè)置opaque屬性為YES
如果用到了圖像,盡量避免透明除非非常必要。如果圖像要顯示在一個(gè)固定的背景顏色或是固定的背景圖之前,你沒(méi)必要相對(duì)前景移動(dòng),你只需要預(yù)填充背景圖片就可以避免運(yùn)行時(shí)混色了。
如果是文本的話,一個(gè)白色背景的UILabel(或者其他顏色)會(huì)比透明背景要更高效。
Color Blended Layers”正是用于檢測(cè)哪里發(fā)生了圖層混合,并用紅色標(biāo)記出來(lái)。因此我們需要盡可能減少看到的紅色區(qū)域。一旦發(fā)現(xiàn)應(yīng)該想法設(shè)法消除它。開(kāi)始調(diào)試后勾選這個(gè)選項(xiàng),我們?cè)谑謾C(jī)上可以看到如下的場(chǎng)景:
2. Color Hits Green and Misses Red : 圖層緩存
光柵化是將一個(gè)layer預(yù)先渲染成位圖(bitmap),然后加入緩存中。如果對(duì)于陰影效果這樣比較消耗資源的靜態(tài)內(nèi)容進(jìn)行緩存,可以得到一定幅度的性能提升。demo中的這一行代碼表示將label的layer光柵化:
label.layer.shouldRasterize = YES;
它表示如果命中緩存則顯示為綠色,否則顯示為紅色,顯然綠色越多越好,紅色越少越好。
注意:光柵化的核心在于緩存的思想。
這是因?yàn)閘ayer進(jìn)行光柵化后渲染成位圖放在緩存中。當(dāng)屏幕出現(xiàn)滑動(dòng)時(shí),我們直接從緩存中讀取而不必渲染,所以會(huì)看到綠色。當(dāng)新的label出現(xiàn)時(shí),緩存中沒(méi)有個(gè)這個(gè)label的位圖,所以會(huì)變成紅色。第三點(diǎn)比較關(guān)鍵,緩存中的對(duì)象有效期只有100ms,即如果在0.1s內(nèi)沒(méi)有被使用就會(huì)自動(dòng)從緩存中清理出去。這就是為什么停留一會(huì)兒再滑動(dòng)就會(huì)看到紅色。
當(dāng)我們使用得當(dāng)時(shí),光柵化可以提供很大的性能優(yōu)勢(shì),但是一定要避免作用在內(nèi)容不斷變動(dòng)的圖層上,否則它緩存方面的好處就會(huì)消失,而且會(huì)讓性能變的更糟。
3、Color Copied Images 圖片格式檢測(cè)
顏色格式: 像素在內(nèi)存中的布局和它在磁盤中的存儲(chǔ)方式并不相同。考慮一種簡(jiǎn)單的情況:每個(gè)像素有R、G、B和alpha四個(gè)值,每個(gè)值占用1字節(jié),因此每個(gè)像素占用4字節(jié)的內(nèi)存空間。一張1920*1080的照片(iPhone6 Plus的分辨率)一共有2,073,600個(gè)像素,因此占用了超過(guò)8Mb的內(nèi)存。但是一張同樣分辨率的PNG格式或JPEG格式的圖片一般情況下不會(huì)有這么大。這是因?yàn)镴PEG將像素?cái)?shù)據(jù)進(jìn)行了一種非常復(fù)雜且可逆的轉(zhuǎn)化。
CPU主要處理兩件事:
(1)把圖片從PNG或JPEG等格式中解壓出來(lái),得到像素?cái)?shù)據(jù)
(2)如果GPU不支持這種顏色各式,CPU需要進(jìn)行格式轉(zhuǎn)換
比如應(yīng)用中有一些從網(wǎng)絡(luò)下載的圖片,而GPU恰好不支持這個(gè)格式,這就需要CPU預(yù)先進(jìn)行格式轉(zhuǎn)化。
檢測(cè)這種實(shí)時(shí)的格式轉(zhuǎn)化,如果有則會(huì)將圖片標(biāo)記為藍(lán)色。
如果GPU不支持當(dāng)前圖片的顏色格式,那么就會(huì)將圖片交給CPU預(yù)先進(jìn)行格式轉(zhuǎn)化,并且這張圖片標(biāo)記為藍(lán)色。那么GPU支持什么格式呢?蘋果的GPU只解析32bit的顏色格式,如果使用Color Copied Images去調(diào)試發(fā)現(xiàn)是’藍(lán)色’,這個(gè)時(shí)候你也可以去找你們的UI眉眉了~
知識(shí)擴(kuò)展:32bit指的是圖片顏色深度,用“位”來(lái)表示,用來(lái)表示顯示顏色數(shù)量,例如一個(gè)圖片支持256種顏色,那么就需要256個(gè)不同的值來(lái)表示不同的顏色,也就是從0到255,二進(jìn)制表示就是從00000000到11111111,一共需要8位二進(jìn)制數(shù),所以顏色深度是8。通常32bit色彩中使用三個(gè)8bit分別表示R紅G綠B藍(lán),還有一個(gè)8bit常用來(lái)表示透明度(Alpha)。
4、Color Misaligned Images 圖片尺寸是否匹配
在項(xiàng)目中,我們網(wǎng)絡(luò)請(qǐng)求圖片,大小不一,但是展示的UIImageView有時(shí)候是固定大小。這時(shí)候我們就需要圖片的縮放了。圖片的縮放需要占用時(shí)間,因此我們要盡可能保證無(wú)論是本地圖片還是從網(wǎng)絡(luò)或取得圖片的大小,都與其frame保持一致。
如果圖片需要縮放則標(biāo)記為黃色,如果沒(méi)有像素對(duì)齊則標(biāo)記為紫色。勾選上這個(gè)選項(xiàng)并進(jìn)行調(diào)試,可以看到如下場(chǎng)景:
5、Color Offscreen-Rendered Yellow: 圓角,圖層蒙版,陰影,重繪
離屏渲染表示渲染發(fā)生在屏幕之外。離屏渲染意味著把渲染結(jié)果臨時(shí)保存,等用到時(shí)再取出,因此相對(duì)于普通渲染更占用資源。
選項(xiàng)“Color Offscreen-Rendered Yellow”會(huì)把需要離屏渲染的地方標(biāo)記為黃色,大部分情況下我們需要盡可能避免黃色的出現(xiàn)。離屏渲染可能會(huì)自動(dòng)觸發(fā),也可以手動(dòng)觸發(fā)。以下情況可能會(huì)導(dǎo)致觸發(fā)離屏渲染:
1、重寫drawRect方法;(自動(dòng)觸發(fā)離屏渲染)
2、有mask或者是陰影(layer.masksToBounds, layer.shadow*),模糊效果也是一種mask;(自動(dòng)觸發(fā)離屏渲染)
3、layer.shouldRasterize = true;(手動(dòng)開(kāi)啟離屏渲染)
設(shè)置cornerRadius本身并不會(huì)導(dǎo)致離屏渲染,但很多時(shí)候它還需要配合layer.masksToBounds = true使用。根據(jù)之前的總結(jié),設(shè)置masksToBounds會(huì)導(dǎo)致離屏渲染。解決方案是盡可能在滑動(dòng)時(shí)避免設(shè)置圓角,如果必須設(shè)置圓角,可以使用光柵化技術(shù)將圓角緩存起來(lái):
(1)drawRect:方法
(2)layer.shadow
(3)layer.allowsGroupOpacity or layer.allowsEdgeAntialiasing
(4)layer.shouldRasterize
(5)layer.mask
(6)layer.masksToBounds && layer.cornerRadius
6、Color Compositing Fast-Path Blue 快速路徑
離屏渲染的最后一步是把此前的多個(gè)路徑組合起來(lái)。如果這個(gè)組合過(guò)程能由CPU完成,就會(huì)大量減少GPU的工作。這種技術(shù)在繪制地圖中可能用到。
標(biāo)記由硬件繪制的路徑為藍(lán)色,藍(lán)色越多越好,可以對(duì)直接使用OpenGL繪制的圖層進(jìn)行高亮。沒(méi)有對(duì)OpenGL有過(guò)多的研究,所以這里沒(méi)辦法給出demo,大家只需要記住藍(lán)色越多越好就ok。
這個(gè)選項(xiàng)會(huì)對(duì)任何直接使用OpenGL繪制的圖層進(jìn)行高亮。如果僅僅使用UIKit或者Core Animation的API,那么不會(huì)有任何效果。如果使用GLKView或者CAEAGLLayer,那如果不顯示藍(lán)色塊的話就意味著你正在強(qiáng)制CPU渲染額外的紋理,而不是繪制到屏幕。
7、Flash updated Regions : 重繪區(qū)域
這個(gè)選項(xiàng)會(huì)對(duì)重繪的內(nèi)容高亮成黃色,重繪就是指使用Core Graphics繪制,繪制會(huì)損耗一定的性能,因此重繪區(qū)域應(yīng)該越小越好。
8、Color Immediately(顏色刷新頻率)
當(dāng)執(zhí)行顏色刷新的時(shí)候移除10ms的延遲,因?yàn)榭赡茉谔囟ㄇ闆r下你不需要這些延遲,所以使用此選項(xiàng)加快顏色刷新的頻率。不過(guò)一般這個(gè)調(diào)試選項(xiàng)我們是用不到的。
9、Color No-Standard Surface Formats
就是打開(kāi)這個(gè)選項(xiàng),某些Label和Button的背景顏色都會(huì)出現(xiàn)銀白色,但是不是必先現(xiàn)的,有些Label和Button依然正常顏色背景。其他ImageView等控件是不會(huì)出現(xiàn)銀白色的背景顏色。
總結(jié)
以上是生活随笔為你收集整理的iOS Instrument使用之Core Animation(图形性能)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: while 循环进入死循环?
- 下一篇: 人工智能和计算机程序有什么区别,人工智能