Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> UI 優化-android

UI 優化-android

編輯:關於Android編程

從 UI 優化、網絡優化、通信數據格式傳輸優化、內存優化、啟動時間優化、Hybrid 框架優化、React Native 優化等角度.

進行 App 性能優化時,要遵循如下准則:

盡量保證每幀在 16ms 內處理完所有的 CPU 與 GPU 計算、繪制、渲染等操作,否則會造成丟幀卡頓問題。

基於上面的卡頓原理,我們知道所謂的卡頓其實是可以量化的,每次是否能夠成功渲染是非常重要的問題,即 16ms 能否完整的做完一次操作直接決定了卡頓性能問題。

引起 UI 卡頓的常見原因有如下幾種:

1.主線程做了阻塞 UI 的耗時操作;

2.同一時刻動畫執行多次導致 GPU 和 CPU 過度繪制;

3.View 過度繪制導致 GPU 和 CPU 過度繪制;

4.頻繁地進行布局繪制、文本計算等操作導致 View 需要重新渲染;

5.頻繁的對象創建和銷毀;

6.過度復雜的業務邏輯,耗時函數。

UI 卡頓的原因圍繞著提高幀率、減少嵌套布局層次、減少對象創建等角度去解決問題的。

Android 平台主要通過優化 Layout 布局層次角度:減少層級和 Overdraw、防止不必要的重新 Layout 和 Measure、加快界面顯示速度、減少系統 GC 次數等措施去進行 UI 優化。

由於過度繪制指在屏幕的一個像素上繪制多次(譬如一個設置了背景色的TextView就會被繪制兩次,一次背景一次文本;這裡需要強調的是Activity設置的Theme主題的背景不被算在過度繪制層級中),所以最理想的就是繪制一次,也就是藍色(當然這在很多絢麗的界面是不現實的,所以大家有個度即可,我們開發性能優化標准要求:紅色區域不能長期持續超過屏幕三分之一),因此我們需要依據此顏色分布進行代碼優化,譬如優化布局層級、減少沒必要的背景、暫時不顯示的View設置為GONE而不是INVISIBLE、自定義View的onDraw方法設置canvas.clipRect()指定繪制區域或通過canvas.quickreject()減少繪制區域等措施去優化。

通過刪除無用的層級,或者對整個布局進行改造使用RealtiveLayout替換LinerLayout減少布局層級;此外,使用Merge標簽或ViewStub標簽來優化整個布局性能,比如一些顯示錯誤界面、加載提示框界面等,不是必須顯示的這些布局可以使用ViewStub標簽來提升性能。

> 加快界面加載:

1.除了從 XML Layout 文件裡面角度減少布局層級,還通過提前加載布局,即在線程中做一些必要的 inflate 等來提前初始化布局,減少實際顯示時的耗時。對於一些復雜的布局,我們還會自己做View對象復用池,減少 inflate 帶來的性能損耗,特別是在列表控件中。

2.可以通過 TraceView 工具找出主線程的耗時操作和其他耗時的線程並作優化,另外減少主線程的 GC 停頓。因為即使並行 GC,也會對 heap 加鎖,如果主線程請求分配內存的話,也會被掛起,所以盡量避免在主線程分配較多對象和較大的對象,特別是在onDraw等函數中,以減少被掛起的時間。另外可以通過去掉 ListView、ScrollView 等控件的 EdgeEffect 效果,來減少內存分配和加快控件的創建時間。

3.利用本地緩存,主要界面緩存上次的數據,並配合增量的更新和刪除,能做到數據和服務端同步,這樣可以直接展示本地數據,不用等到網絡返回數據。

4.減少不必要的數據協議字段,減少名字長度等,並作壓縮。還可以通過分頁加載數據來加快傳輸解析時間。因為數據越大,傳輸和解析時間也會越久,引發的內存對象分配也會越多。

5.注意線程的優先級,對於占用 CPU 較多時間的函數,也要判斷線程的優先級。

自定義控件防止重新布局

在 ListView 滑動、廣告動畫變化等過程中,圖片和文字有變化,經常會發現整個界面被重新布局,影響了性能。尤其布局復雜時,測量過程很費時,導致明顯卡頓。比如對於大小基本固定的控件和布局例如 TextView、ImageView 來說,這是多余的損耗。采取優化措施,我們使用自定義控件來阻斷,重寫方法requestLayout、onSizeChanged,如果大小沒有變化就阻斷這次請求。對於 ViewPager 等廣告條,可以設置緩存子 View 的數量為廣告的數量。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved