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