1. 程式人生 > >UI渲染回顧簡單筆記

UI渲染回顧簡單筆記

方法 在操作 如果 文本 多張圖片 waiting 可能 協同工作 添加

UI渲染的簡單過程:

CPU,GPU,顯示器協同工作,CPU 中計算顯示內容,比如視圖的創建、布局計算、圖片解碼、文本繪制等,然後將計算結果提交給GPU,由 GPU 進行變換、合成、渲染。隨後 GPU 會把渲染結果提交到幀緩沖區去,隨後等待下一次 VSync(垂直同步信號) 到來時,視頻控制器會逐行讀取幀緩沖區的數據,經過可能的數模轉換傳遞給顯示器顯示。由於垂直同步的機制,如果在一個 VSync 時間內,CPU 或者 GPU 沒有完成內容提交,則那一幀就會被丟棄,等待下一次機會再顯示,而這時顯示屏會保留之前的內容不變。這就是界面卡頓的原因。CPU 和 GPU 不論哪個阻礙了顯示流程,都會造成掉幀現象。所以開發時,也需要分別對 CPU 和 GPU 壓力進行評估和優化。

渲染時機:

Core Animation 在 RunLoop 中註冊了一個 Observer 監聽 BeforeWaiting(即將進入休眠) 和 Exit (即將退出Loop) 事件 。當在操作 UI 時,比如改變了 Frame、更新了 UIView/CALayer 的層次時,或者手動調用了 UIView/CALayer 的 setNeedsLayout/setNeedsDisplay方法後,這個 UIView/CALayer 就被標記為待處理,並被提交到一個全局的容器去。當Oberver監聽的事件到來時,回調執行函數中會遍歷所有待處理的UIView/CAlayer 以執行實際的繪制和調整,並更新 UI 界面。

UI優化方案:

1 性能敏感界面,少用Storyboard

2 對象盡可能復用,減少對象創建,釋放的次數

3 對view應該盡量減少不必要的屬性修改。應該盡量避免調整視圖層次、添加和移除視圖。可以通過隱藏,顯示來控制

4 布局方面:盡量提前計算好布局,在需要時一次性調整好對應屬性,而不要多次、頻繁的計算和調整這些屬性。

5 Autolayout 對於復雜視圖來說常常會產生嚴重的性能問題。隨著視圖數量的增長,Autolayout 帶來的 CPU 消耗會呈指數級上升

6 盡量減少在短時間內大量圖片的顯示,盡可能將多張圖片合成為一張進行顯示。

7 應用應當盡量減少視圖數量和層次,也可以用上面的方法,把多個視圖預先渲染為一張圖片來顯示。

8 CALayer 的 border、圓角、陰影、遮罩(mask),CASharpLayer 的矢量圖形顯示,通常會觸發離屏渲染(offscreen rendering),而離屏渲染通常發生在 GPU 中。避免使用圓角、陰影、遮罩等屬性。

UI渲染回顧簡單筆記