1.首先新建項目-打開protect-profile
左側 數值代表的fpsfps:我們知道任何屏幕總是有一個刷新率,比如iphone推薦的刷新率是60Hz,也就是說GPU每秒鐘刷新屏幕60次,因此兩次刷新之間的間隔為16.67ms。這段時間內屏幕內容保持不變,稱為一幀(frame),fps表示frames per second,也就是每秒鐘顯示多少幀畫面。對于靜止不變的內容,我們不需要考慮它的刷新率,但在執行動畫或滑動時,fps的值直接反映出滑動的流暢程度。
fps 為0時,表示屏幕未動! 一般fps<30 就有明顯的卡頓 ,蘋果官方給的標準值為fps為60!
一般影響fps的因素(掉幀):1.阻塞主線程,這就是官方為啥認定刷新UI必須在主線程的原因
2.原因較多,但是大部分原因是在于離屏渲染,渲染耗損過高.
頂部的震動條就是動態圖!
右側:color blended layers 顏色混合層
color hits green and missed red綠色和紅色的顏色
flash update regionsFlash更新區
1、Color Blended Layers
(1)、圖層混合
首先我們要明白像素的概念,屏幕上每一個點都是一個像素,像素有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,從而節約了很多不必要的運算。
(2)、調試Color Blended Layers
第一個調試選項”Color Blended Layers”正是用于檢測哪里發生了圖層混合,并用紅色標記出來。因此我們需要盡可能減少看到的紅色區域。一旦發現應該想法設法消除它。開始調試后勾選這個選項,我們在手機上可以看到如下的場景:
2、Color Hits Green and Misses Red
(1)、光柵化
? ? ? ?光柵化是將一個layer預先渲染成位圖(bitmap),然后加入緩存中。如果對于陰影效果這樣比較消耗資源的靜態內容進行緩存,可以得到一定幅度的性能提升。demo中的這一行代碼表示將label的layer光柵化:
label.layer.shouldRasterize = YES;
(2)、調試Color Hits Green and Misses Red
它表示如果命中緩存則顯示為綠色,否則顯示為紅色,顯然綠色越多越好,紅色越少越好。
注意:光柵化的核心在于緩存的思想。我們自己動手把玩一下,可以發現以下幾個有意思的現象:
上下微小幅度滑動時,一直是綠色上下較大幅度滑動,新出現的label一開始是紅色,隨后變成綠色如果靜止一秒鐘,剛開始滑動時會變紅。
這是因為layer進行光柵化后渲染成位圖放在緩存中。當屏幕出現滑動時,我們直接從緩存中讀取而不必渲染,所以會看到綠色。當新的label出現時,緩存中沒有個這個label的位圖,所以會變成紅色。第三點比較關鍵,緩存中的對象有效期只有100ms,即如果在0.1s內沒有被使用就會自動從緩存中清理出去。這就是為什么停留一會兒再滑動就會看到紅色。
光柵化的緩存機制是一把雙刃劍,先寫入緩存再讀取有可能消耗較多的時間。因此光柵化僅適用于較復雜的、靜態的效果。通過Instrument的調試發現,這里使用光柵化經常出現未命中緩存的情況,如果沒有特殊需要則可以關閉光柵化,所以我們做的第二個優化是注釋掉下面這行代碼
//? ? label.layer.shouldRasterize = true
3、Color Copied Images
(1)、顏色格式
像素在內存中的布局和它在磁盤中的存儲方式并不相同??紤]一種簡單的情況:每個像素有R、G、B和alpha四個值,每個值占用1字節,因此每個像素占用4字節的內存空間。一張1920*1080的照片(iPhone6 Plus的分辨率)一共有2,073,600個像素,因此占用了超過8Mb的內存。但是一張同樣分辨率的PNG格式或JPEG格式的圖片一般情況下不會有這么大。這是因為JPEG將像素數據進行了一種非常復雜且可逆的轉化。
CPU主要處理兩件事:
(1)把圖片從PNG或JPEG等格式中解壓出來,得到像素數據
(2)如果GPU不支持這種顏色各式,CPU需要進行格式轉換
(2)、調試Color Copied Images
第三個選項“Color Copied Images”就用來檢測這種實時的格式轉化,如果有則會將圖片標記為藍色。