[原] Android持續優化 - 提高流暢度

雨知發表於2013-12-26

一.形象的感官一下流暢度概念

1. 這是官方給出的概念:Android流暢執行,需要執行60幀/秒, 則需要每幀的處理時間不超過16ms。

2. 每秒幀數,實際上就是指動畫或視訊每秒放映的畫面數。因此“幀”的概念就是指“畫面”,1幅畫就叫做“1幀”,每秒幀數指的就是“每秒播放的畫面數”。幀數就是在1秒鐘時間裡傳輸的圖片的量,也可以理解為圖形處理器每秒鐘能夠重新整理幾次,通常用fps(Frames Per Second)表示。每一幀都是靜止的圖象,快速連續地顯示幀便形成了運動的假象。高的幀率可以得到更流暢、更逼真的動畫。每秒鐘幀數 (fps) 愈多,所顯示的動作就會愈流暢。

3. 一幀佔用記憶體數

當畫面的解析度是1024×768,重新整理率要達到60幀/秒時,那麼顯示卡在一秒鐘內需要處理的畫素量就達到了“1024×768×60=5713920”。那麼一個“畫素量”,相當與佔用多少記憶體?我們用點陣圖來代替粗略計算,把解析度是1024×768看成一張對應大小的點陣圖,通過點陣圖的大小來大概計算佔用的記憶體大小。而點陣圖的儲存演算法,在維基百科上有詳細的介紹,詳見下面的連結。

一張1024×768的16位(bit)點陣圖檔案大小 = 1024×768×16/8 = 1572864 B = 1536 KB = 1.5 MB。如果要求畫面的重新整理率達到60幀/秒,則每秒需要處理的資料量就達到1.5 * 60 = 90 MB,這個資料是相當大。

實際系統中會通過GPU顯示卡處理顯示,減少CPU工作量,或者系統會快取或區域性重新整理來降低處理量。沒有研究過,也很想研究一下顯示的流程。

二.Android流暢度的根本:解放UI主執行緒

1. 不要阻塞UI執行緒;

2. 不要在UI執行緒之外操作UI。

三.以ListView載入圖片為例

更流暢?

1. ListView如何流暢順滑載入?

2. ListView使用convertView可以提高兩倍效能?

3. ListView回收item的原理是什麼?

4. ListView重複載入呼叫的問題?

5. 如何解決圖片載入OOM問題?

6. 如何更流暢的載入圖片?

7. ListView載入大量圖片併發問題?

ListView優化要點

1. 優化Adapter,使用convertView,效率提高2倍;

2. 優化item佈局,提高整體效能;

3. ListView重複呼叫問題可以設定layout_height高度固定或者fill_parent,載入的原理;

4. 使用addHeader和addFooter代替ScrollView;

圖片載入優化要點

1. 有效載入大圖片,合理設定BitmapFactory.Options的inSampleSize值,減少圖片記憶體佔用;

2. 僅請求圖片的大小,inJustDecodeBounds = true,僅請求圖片大小,而不會載入圖片到記憶體;

3. 快取圖片,記憶體快取LruCache,硬碟快取 DiskLruCache

4. 使用非UI執行緒載入圖片,使用 AsyncTask

5. 使用軟引用SoftReference,繫結ImageView和url,處理ListView併發載入問

6. Android官方圖片載入利器BitmapFun解析

四.其他

Google官方教程(一定要讀):

Android程式和執行緒-Processes and Threads

改善佈局效能-Improving Layout Performance

1. 優化佈局層次結構—Optimizing Layout Hierarchies

2. 使用標籤include重用佈局—Re-using Layouts with include

3. 按需載入檢視—Loading Views On Demand

4. ListView的平滑滾動—Making ListView Scrolling Smooth

高效顯示點陣圖-Displaying Bitmaps Efficiently

1. 有效的處理較大的點陣圖-Loading Large Bitmaps Efficiently

2. 處理來自UI執行緒的點陣圖-Processing Bitmaps Off the UI Thread

3. 快取點陣圖-Caching Bitmaps

4. 在你的UI中顯示點陣圖-Displaying Bitmaps in Your UI

其他好文章:

Android開發規範之編碼規範

Android開發效能優化簡介

參考:

1. 每秒幀數
2. 點陣圖

相關文章