一.形象的感官一下流暢度概念
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解析