大多數手機的螢幕重新整理頻率是60hz,如果在1000/60=16.67ms內沒有辦法把這一幀的任務執行完畢,系統將放棄這一幀,即發生丟幀的現象。在動畫中出現乙個丟棄幀會在平滑的體驗中看到乙個跳躍,使用者可以很容易看出來。丟幀越多,使用者感受到的卡頓情況就越嚴重。
如圖某個時候我們需要用34ms的時間去更新ui,這是使用者就會感覺到卡頓。
那麼都有哪些情況可能我們不能再16ms的時間內完成呢?
1.花了太多時間去重繪大量的檢視層次(view hierarchy),這是很浪費cpu週期的。
2.繪製了太多的物件,在畫素著色上浪費了寶貴的時間,然而這些物件對終端使用者而言都是不可見的。
3.一遍又一遍的在做大量的動畫,這會導致cpu和gpu產生大量的工作。
渲染操作通常依賴於兩個核心元件:cpu與gpu。cpu負責包括measure,layout,record,execute的計算操作,gpu負責rasterization(柵格化)操作。resterization柵格化是繪製那些button,shape,path,string,bitmap等元件最基礎的操作。它把那些元件拆分到不同的畫素上進行顯示。這是乙個很費時的操作,gpu的引入就是為了加快柵格化的操作。cpu負責把ui元件計算成polygons,texture紋理,然後交給gpu進行柵格化渲染。
overdraw(過度繪製)描述的是螢幕上的某個畫素在同一幀的時間內被繪製了多次。在多層次重疊的ui結構裡面,如果不可見的ui也在做繪製的操作,會導致某些畫素區域被繪製了多次。這樣就會浪費大量的cpu以及gpu資源。
我們可以通過手機設定裡面的開發者選項,開啟除錯gpu過度繪製的選項。
藍色,淡綠,淡紅,深紅代表了4種不同程度的overdraw情況,我們的目標就是儘量減少紅色overdraw,看到更多的藍色區域。
1.移除window預設的background
2.移除xml布局檔案中非必需的background
3.按需顯示佔位背景
我們可以通過canvas.cliprect()來幫助系統識別那些可見的區域。這個方法可以指定一塊矩形區域,只有在這個區域內才會被繪製,其他的區域會被忽視。這個api可以很好的幫助那些有多組重疊元件的自定義view來控制顯示的區域。同時cliprect方法還可以幫助節約cpu與gpu資源,在cliprect區域之外的繪製指令都不會被執行,那些部分內容在矩形區域內的元件,仍然會得到繪製。除了cliprect方法之外,我們還可以使用canvas.quickreject()來判斷是否沒和某個矩形相交,從而跳過那些非矩形區域內的繪製操作。
view的ondraw方法要避免執行大量的操作,主要指兩個方面。
1.ondraw中不要穿件新的區域性變數,因為ondraw方法可能會被頻繁呼叫。
2.ondraw方法中不要做耗時的操作,也不要執行過多的迴圈操作,否則很難保證每幀的繪製時間不超過16ms。
Android效能調優 繪製優化
4.1 開發者中的 過渡繪製 檢測 4.2 開發者中的 gpu 檢測 5.1 布局優化 1.減少介面巢狀,對於負責的view可以使用constraintlayout 2.使用include復用布局 3.使用merge去除多餘層級 4.使用viewstub提高載入速度 按需才載入 顯示 5.減少不必要...
Android之效能優化
目的 減少布局檔案的層級,減少android繪製時的工作量。方法 刪除布局中無用的控制項和層級 選用效能較低的viewgroup linearlayout,framelayout1.ondraw中不要建立新的區域性物件 2.ondraw中不要做耗時任務 產生記憶體洩漏原因 1.靜態變數導致 2.單例...
Android效能優化之執行緒優化
不能通過非ui執行緒對view進行操作。因為android的ui不是安全的,如果view能被不同的執行緒所訪問或修改,那麼就可能在程式的執行期間,產生不可預期的行為或者併發錯誤。使用執行緒時,避免在循壞中使用同步,因為獲取和釋放鎖的操作代價很大。會引起cpu資源的損耗。處理多執行緒以及執行緒間通訊時...