前言
在看性能優化文章裡, 看到不少提到要把相應控件設定成不透明,特别是在滾動頁面上,但是沒有看到深入說明為什麼要這樣去做, 如果控件是透明的将會帶來什麼影響,還有當中涉及到的知識點都沒有提出來.
我們先來看這三個影響視圖顯示的屬性
alpha
顯示器是由一個個點的像素組成,每個像素都是由 RGBA 顔色空間來表示, alpha 即代表 A. 它是一個 CGFloat 浮點值類型, 由 0~1 範圍組成, 0表示透明, 1表示不透明.
- 當我們設定一個 View 為透明時, 其 subView 會受其影響會直接隐藏. 不管其 Alpah值為多少.
- 當一個 View 為透明時, 其不會具有相應功能,響應鍊會直接将事件直接傳遞到其下一個視圖。
hidden
其是一個 Bool 值.
當其設定成 No 時, 與 alpha 設定成 0 同理.
opaque
此屬性表示不透明, 一般控件此屬性預設都是 Yes, 即表示不透明. 但是 UIButton 子類預設是 No, 這個要注意.
如果我們将 View 的 opaque 屬性設定成 No, 并不是使其變成透明, 不知道這裡是系統對其作了一層處理還是什麼原因,總之一個 View 我們将其設定成 No 之後, 其還是正常展示, 估計這個屬性設定成No 之後還要看其 Alpha 值來進行渲染. 是以改變此屬性并不會使其變成透明.
但是這個屬性的作用是什麼呢?
圖層混用
看到2013 年的文章, 當兩個視圖相交到一起的時候, 如果将其中一個視圖此屬性改成 No, 也就是透明, 則會按照此公式來計算混合圖層 RGBA
R = S + D * ( 1 – Sa )
通過 GPU 來計算出一個 混合後的顔色值, 然後進行展示, 假如此圖層出現在滾動頁面中, 則是相對影響性能的,因為螢幕一般滾動起來會涉及到 FPS, 一旦 FPS 過低,很容易就通過肉眼看到卡頓的感覺, FPS理想狀态要保持在 60左右. 1S 刷頻 60次。
回到圖層混用, 但是現在我使用兩個相交的 View 其 opaque 屬性設定成 No, 顯出出來的圖層并沒有出現圖層混用的效果. 猜測系統已經對此屬性進行了優化,是以此屬性已經不會再造成圖層混用。
-
為什麼會出現圖層混用,當兩個視圖相交在一起時,假如上面的視圖 alpha 值不為1,的情況下, 就會出現一個混合圖層的顔色, 因為其透明的緣故無法完全遮擋住下面的圖層, 是以 GPU 會 通過 公式去進行計算,是以有時候會相應的影響性能,
假設其值為1的話 R = S + D * (1 - 1) 則為 R = S. 即計算會很快。 未必真正計算是通過此公式。可能會更加複雜。
是以要盡量避免, 特别是在滾動視圖。
參考
https://bestswifter.com/uikitxing-neng-diao-you-shi-zhan-jiang-jie/ UIKit性能調優實戰講解最後
希望此篇文章對您有所幫助,如有不對的地方,希望大家能留言指出糾正。
謝謝!!!!!
學習的路上,與君共勉!!!
本文原創作者: https://www.jianshu.com/u/9c6bbe968616 Jersey . 歡迎轉載,請注明出處和 https://www.jianshu.com/p/730a0619c339 本文連結