性能優化(一)UI繪製優化

CPU和GPU工作流程

CPU 的任務繁多,做邏輯計算外,還要做內存管理、顯示操作,因此 在實際運算的時候性能會大打折扣,在沒有 GPU 的時代,不能顯示覆 雜的圖形,其運算速度遠跟不上今天覆雜三維遊戲的要求。即使 CPU 的工作頻率超過 2GHz 或更高,對它繪製圖形提高也不大。這時 GPU 的設計就出來了,CPU把計算的結果顯示丟給GPU了。

黃色的 Control 爲控制器,用於協調控制整個 CPU 的運行,包括取出指令、控制其他模塊的運行等;                                     

綠色的 ALU ( Arithmetic Logic Unit )是算術邏輯單元,用於進行數學、邏輯運算;                                                              

橙色的 Cache 和 DRAM 分別爲緩存和 RAM ,用於存儲信息。

從結構圖可以看出, CPU 的控制器較爲複雜,而 ALU 數量較少。因此 CPU 擅長各種複雜 的邏輯運算,但不擅長數學尤其是浮點運算。

60Hz刷新頻率由來

12 fps :由於人類眼睛的特殊生理結構,如果所看畫面之幀率高於每秒約 10-12 幀的時候,就會 認爲是連貫的;                      

24 fps :有聲電影的拍攝及播放幀率均爲每秒 24 幀,對一般人而言已算可接受;                                                                        

30 fps :早期的高動態電子遊戲,幀率少於每秒 30 幀的話就會顯得不連貫,這是因爲沒有動態模 糊使流暢度降低;                 

60 fps: 在與手機交互過程中,如觸摸和反饋 60 幀以下人是能感覺出來的。 60 幀以上不能察覺 變化 當幀率低於 60 fps 時感覺的畫面的卡頓和遲滯現象。

Android 系統每隔 16ms 發出 VSYNC 信號 (1000ms/60=16.66ms) ,觸發對 UI 進行渲染, 如果每次渲染都成 功這樣就能夠達到流暢的畫面所需要的 60fps ,爲了能夠實現 60fps ,這意味着計算渲染的大多數操作都必須 在 16ms 內完成。16 毫秒的時間主要被兩件事情所佔用 第一件:將 UI 對象轉換爲一系列多邊形和紋理 ; 第二件: CPU 傳遞處理數據到 GPU 。所以很明顯,我們要縮短 這兩部分的時間,也就是說需要儘量減少對象轉換的次數,以及上傳數據的次數。否則當一幀畫面渲染的時間超過16ms的時候,垂直同步機制會讓顯示器硬件等待GPU完成柵格化操作,會讓這一幀畫面多停留16ms,甚至更多就讓用戶看起來畫面停頓。

  如何減少這兩部分的時間 以至於在 16ms 完成呢:CPU減少 xml 轉換成對象的時間,GPU減少重複繪製的時間。

過度繪製:

GPU的繪製過程,就跟刷牆一樣,一層一層的進行,16ms刷一次,這樣就會造成圖層覆蓋的現象,無用的圖層也會被繪製在底層造成不必要的浪費。

GPU過度繪製的幾種情況:

1、自定義控件中onDraw方法做了過多的重複繪製

2、佈局層級過深,重疊性強,用戶看不到的區域GPU也會渲染,導致耗時增加

過度繪製查看工具:

在手機的開發者選項中,有OverDraw監測工具,調試GPU過度繪製工具,顏色代表過度繪製圖層情況

       

我們的目標是儘量減少紅色,看到更多的藍色

處理措施:

1、減少背景重複    如:Activity主題中的背景設置可以去掉設置爲@null,非業務需要不要設置背景

2、使用裁減減少控件之間的重合部分

另:Android在7.0之後自己也做了優化,invalidate()不再執行測量和佈局動作。

佈局優化(主要減少CPU工作量)

常用的檢測工具:

1、Android/sdk/tools/bin/ui    automator   viewer.bat

2、Android\sdk\tools\monitor.bat

3、Device Monitor窗口中Hierarchy view             

Hierarchy view 中三個點也是代表着View的Measure, Layout和Draw,

綠: 表示該View的此項性能比該View Tree中超過50%的View都要快;例如,代表Measure的是綠點,意味着這個視圖的測量時間快於樹中的視圖對象的50%。

黃: 表示該View的此項性能比該View Tree中超過50%的View都要慢;

紅: 表示該View的此項性能是View Tree中最慢的。

處理措施:

1、能在一個平面顯示的內容,儘量只用一個容器

2、儘可能把相同的容器合併merge

3、能複用的代碼,用include處理,可以減少GPU重複工作

性能優化其實都是從細節深入研究處理,要求我們養成好的編碼習慣!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章