UI效能優化

weixin_34146805發表於2018-04-08

措施

1、避免圖層混合

  1. 確保控制元件的opaque屬性設定為true,確保backgroundColor和父檢視顏色一致且不透明
  2. 如無特殊需要,不要設定低於1的alpha
  3. 確保UIImage沒有alpha通道

2、避免臨時轉換

  1. 確保圖片大小和frame一致,不要在滑動時縮放圖片
  2. 確保圖片顏色格式被GPU支援,避免勞煩CPU轉換

3、慎用離屏渲染

  1. 絕大多數時候離屏渲染會影響效能
  2. 重寫drawRect方法,設定圓角、陰影、模糊效果,光柵化都會導致離屏渲染
  3. 設定陰影效果是加上陰影路徑
  4. 滑動時若需要圓角效果,開啟光柵化

UIView與CALayer

在iOS系統中所有顯示的檢視都是從基類UIView繼承而來的,同時UIView負責接收使用者互動。但是實際上你所看到的檢視內容,包括圖形等,都是由UIView的一個例項圖層屬性來繪製和渲染的,那就是CALayer。

CALayer類的概念與UIView非常類似,它也具有樹形的層級關係,並且可以包含圖片文字、背景色等。它與UIView最大的不同在於它不能響應使用者互動,可以說它根本就不知道響應鏈的存在,它的API雖然提供了“某點是否在圖層範圍內的方法”,但是它並不具有響應的能力。

在每一個UIView例項當中,都有一個預設的支援圖層,UIView負責建立並且管理這個圖層。實際上這個CALayer圖層才是真正用來在螢幕上顯示的,UIView僅僅是對它的一層封裝,實現了CALayer的delegate,提供了處理事件互動的具體功能,還有動畫底層方法的高階API。

可以說CALayer是UIView的內部實現細節。

圓角與離屏渲染

總結

  • 如果能夠只用 cornerRadius 解決問題,就不用優化。
  • 如果必須設定 masksToBounds,可以參考圓角檢視的數量,如果數量較少(一頁只有幾個)也可以考慮不用優化。
  • UIImageView 的圓角通過直接擷取圖片實現,其它檢視的圓角可以通過 Core Graphics 畫出圓角矩形實現。

設定圓角很簡單,它不會帶來任何效能損耗

view.layer.cornerRadius = 5 

這行程式碼不會產生額外的效能損耗。在預設情況下,這個屬性只會影響檢視的背景顏色和 border。對於 UILabel 這樣內部還有子檢視的控制元件就無能為力了。所以很多情況下我們會看到這樣的程式碼:

label.layer.cornerRadius = 5  
label.layer.masksToBounds = true  

正確的做法是對於UIView,自己畫一個帶圓角的背景圖,建立一個imageView插入到檢視底層。對於UIImageView來說是直接擷取圖片,然後圓角路徑直接用貝塞爾曲線繪製,這樣來生成一個複合圖片。

1.記憶體惡鬼drawRect
2.iOS 高效新增圓角效果實戰講解
3.效能調優實戰
4.iOS 保持介面流暢的技巧
5.iOS Core Animation: Advanced Techniques中文譯本
6.使用 ASDK 效能調優 - 提升 iOS 介面的渲染效能

相關文章