iOS應用性能調優之儘量使Views不透明
若是你有不透明的Views,你應該設置它們的opaque屬性爲YES。html
緣由是這會使系統用一個最優的方式渲染這些views。這個簡單的屬性在IB或者代碼裏均可以設定。ios
Apple的文檔對於爲圖片設置不透明屬性的描述是:性能優化

(opaque)這個屬性給渲染系統提供了一個如何處理這個view的提示。若是設爲YES, 渲染系統就認爲這個view是徹底不透明的,這使得渲染系統優化一些渲染過程和提升性能。若是設置爲NO,渲染系統正常地和其它內容組成這個View。默認值是YES。微信
在相對比較靜止的畫面中,設置這個屬性不會有太大影響。然而當這個view嵌在scroll view裏邊,或者是一個複雜動畫的一部分,不設置這個屬性的話會在很大程度上影響app的性能。app
你能夠在模擬器中用Debug\Color Blended Layers選項來發現哪些view沒有被設置爲opaque。目標就是,能設爲opaque的就全設爲opaque!iview
UIView的alpha、hidden和opaque屬性之間的關係和區別
轉載請註明出處
若是以爲文章對你有所幫助,請經過留言或關注微信公衆賬號wangzzstrive來支持我,謝謝!
1、alpha
液晶顯示器是由一個個的像素點組成的,每一個像素點均可以顯示一個由RGBA顏色空間組成的一種色值。其中的A就表示透明度alpha,UIView中alpha是一個浮點值,取值範圍0~1.0,表示從徹底透明到徹底不透明。
當把alpha的值設置成0之後:
一、當前的UIView和subview都會被隱藏,而無論subview的alpha值爲多少。
二、當前UIView會從響應者鏈中移除,而響應者鏈中的下一個會成爲第一響應者
alpha的默認值是1.0。
另外,更改alpha值時,默認是有動畫效果的,這是由於圖層在Cocoa中是由Core Animation中CALayer表示的,該動畫效果是CALayer的隱含動畫。固然也有辦法禁用此動畫效果,在這就很少述了,感興趣的同窗能夠繼續關注後續的博客。
2、hidden
該屬性爲BOOL值,用來表示UIView是否隱藏,默認值是NO。
當值設爲YES時:
一、當前的UIView和subview都會被隱藏,而無論subview的hidden值爲多少。
二、當前UIView會從響應者鏈中移除,而響應者鏈中的下一個會成爲第一響應者
總之,同alpha爲0時的顯示效果相同。具體二者之間有什麼區別就不清楚了,若是有知道的還望不吝賜教!
3、opaque
該屬性爲BOOL值,UIView的默認值是YES,但UIButton等子類的默認值都是NO。opaque表示當前UIView是否不透明,不過搞笑的是事實上它卻決定不了當前UIView是否是不透明,好比你將opaque設爲NO,該UIView照樣是可見的(上文說過,是否可見是由alpha或hidden屬性決定的),照理說爲NO就表示透明,那就應該是不可見的呀?
賣個關子,先看下圖:
前面講過,顯示器中的每一個像素點均可以顯示一個由RGBA顏色空間組成的色值,好比上圖中有紅色和綠色兩個圖層色塊,對於沒有交叉的部分,即純紅色和綠色部分來講,對應位置的像素點只須要簡單的顯示紅或綠,對應的RGBA爲(1,0,0,1)和(0,1,0,1)就好了,負責圖形顯示的GPU須要很小的計算量就能夠肯定像素點對應的顯示內容。
問題是紅色和綠色還有相交的一塊,其相交的顏色爲黃色。這裏的黃色是怎麼來的呢?原來,GPU會經過圖層一和圖層二的顏色進行圖層混合,計算出混合部分的顏色,最理想狀況的計算公式以下:
R = S + D * ( 1 – Sa )性能
其中,R表示混合結果的顏色,S是源顏色(位於上層的紅色圖層一),D是目標顏色(位於下層的綠色圖層二),Sa是源顏色的alpha值,即透明度。公式中全部的S和D顏色都假定已經預先乘以了他們的透明度。優化
知道圖層混合的基本原理之後,再回到正題說說opaque屬性的做用。當UIView的opaque屬性被設爲YES之後,按照上面的公式,也就是Sa的值爲1,這個時候公式就變成了:動畫
R = Sui
即無論D爲何,結果都同樣。所以GPU將不會作任何的計算合成,不須要考慮它下方的任何東西(由於都被它遮擋住了),而是簡單從這個層拷貝。這節省了GPU至關大的工做量。由此看來,opaque屬性的真實用處是給繪圖系統提供一個性能優化開關!
按照前面的邏輯,當opaque屬性被設爲YES時,GPU就不會再利用圖層顏色合成公式去合成真正的色值。所以,若是opaque被設置成YES,而對應UIView的alpha屬性不爲1.0的時候,就會有不可預料的狀況發生,這一點蘋果在官方文檔中有明確的說明:
An opaque view is expected to fill its bounds with entirely opaque content—that is, the content should have an alpha value of
1.0
. If the view is opaque and either does not fill its bounds or contains wholly or partially transparent content,the results are unpredictable. You should always set the value of this property to
NO
if the view is fully or partially transparent.
你們切記!!!!
4、最後
當把UIView的alpha屬性設成0,或者把hidden設成YES的時候,當前UIView和它所包含的子UIView都會變成不可見,同時也不會再響應event事件。注意這裏是或的關係,即只要設置了其中的一個都會有此效果,而無論另一個屬性的值是什麼。