1. 程式人生 > >Instruments 中 Core Animation優化(二)

Instruments 中 Core Animation優化(二)

1-Color Blended Layers (圖層混合)

   這個選項是檢測哪裡發生了圖層混合,先介紹一下什麼是圖層混合?很多情況下,介面都是會出現多個UI控制元件疊加的情況,如果有透明或者半透明的控制元件,那麼GPU會去計算這些這些layer最終的顯示的顏色,也就是我們肉眼所看到的效果。例如一個上層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分量

Color Blended Layers (圖層混合) 模式下,如果介面出現混合圖層,那麼該控制元件會顯示成紅色。如下圖:
這裡寫圖片描述

如何消除這些 混合圖層呢?設定一個不透明的背景顏色就可以了

;self.lab2.backgroundColor = self.lab2.superview.backgroundColor;
 self.lab2.layer.masksToBounds = YES;//單獨設定不會離屏渲染

細心的朋友可能會注意到為什麼要設定masksToBounds = YES


這是因為 label的內容是中文,label實際渲染區域要大於label的size,最外層多了一個sublayer。
中文不設定 maskToBounds

然後是設定 maskToBounds
中文設定  maskToBounds

英文不需要設定 maskToBounds
這裡寫圖片描述

注意點:UIImageView,本身不透明,並且它的內容圖片image 也必須是不透明的。
如果UIImageView紅色圖層混合,就應該排查自己的程式碼和圖片自身的問題了。先吃飯,下午繼續

我回來了,繼續!
2- Color Offscreen-Rendered Yellow(離屏渲染)
我發現! 在iOS 11上設定

; self.lab1.layer.masksToBounds
= YES; self.lab1.layer.cornerRadius = 5; //設定這兩個屬性居然沒有出現離屏渲染,我猜是iOS 11做了處理吧,

如下圖

引用塊內容

但是在iOS 11以前是會出現的 可能是某個環節出現了錯誤,還在排查中,歡迎指出:
由於測試機全是iOS 11的,所以去其他地方找了點資料:

離屏渲染Off-Screen Rendering 指的是GPU在當前螢幕緩衝區以外新開闢一個緩衝區進行渲染操作。還有另外一種螢幕渲染方式-當前螢幕渲染On-Screen Rendering ,指的是GPU的渲染操作是在當前用於顯示的螢幕緩衝區中進行。 離屏渲染會先在螢幕外建立新緩衝區,離屏渲染結束後,再從離屏切到當前螢幕, 把離屏的渲染結果顯示到當前螢幕上,這個上下文切換的過程是非常消耗效能的,實際開發中儘可能避免離屏渲染。
觸發離屏渲染Offscreen rendering的行為:
(1)drawRect:方法
(2)layer.shadow3)layer.allowsGroupOpacity or layer.allowsEdgeAntialiasing4)layer.shouldRasterize5)layer.mask6)layer.masksToBounds && layer.cornerRadius
這裡有需要注意的是第三條layer.shouldRasterize ,其實就是我們本文講的第三個選項光柵化,光柵化會觸發離屏渲染,因此光柵化慎用。
前面說到 設定圓角會觸發離屏渲染,設定圓角觸發離屏渲染要同時滿足下面兩個條件:
;layer.masksToBounds = YES;
;layer.cornerRadius = 5;

3-Color Misaligned Images(圖片大小)
這個選項檢查了圖片是否被放縮,畫素是否對齊。被放縮的圖片會被標記為黃色,畫素不對齊則會標註為紫色。