一.形象的感官一下流暢度概念
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併發載入問
四.其他
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
4. 在你的UI中顯示點陣圖-Displaying Bitmaps in Your UI