[原] Android持续优化 - 提高流畅度
一.形象的感官一下流暢度概念
1. 這是官方給出的概念:Android流暢運(yùn)行,需要運(yùn)行60幀/秒, 則需要每幀的處理時(shí)間不超過16ms。
2. 每秒幀數(shù),實(shí)際上就是指動(dòng)畫或視頻每秒放映的畫面數(shù)。因此“幀”的概念就是指“畫面”,1幅畫就叫做“1幀”,每秒幀數(shù)指的就是“每秒播放的畫面數(shù)”。幀數(shù)就是在1秒鐘時(shí)間里傳輸?shù)膱D片的量,也可以理解為圖形處理器每秒鐘能夠刷新幾次,通常用fps(Frames Per Second)表示。每一幀都是靜止的圖象,快速連續(xù)地顯示幀便形成了運(yùn)動(dòng)的假象。高的幀率可以得到更流暢、更逼真的動(dòng)畫。每秒鐘幀數(shù) (fps) 愈多,所顯示的動(dòng)作就會愈流暢。
3. 一幀占用內(nèi)存數(shù)
當(dāng)畫面的分辨率是1024×768,刷新率要達(dá)到60幀/秒時(shí),那么顯卡在一秒鐘內(nèi)需要處理的像素量就達(dá)到了“1024×768×60=5713920”。那么一個(gè)“像素量”,相當(dāng)與占用多少內(nèi)存?我們用位圖來代替粗略計(jì)算,把分辨率是1024×768看成一張對應(yīng)大小的位圖,通過位圖的大小來大概計(jì)算占用的內(nèi)存大小。而位圖的存儲算法,在維基百科上有詳細(xì)的介紹,詳見下面的鏈接。
一張1024×768的16位(bit)位圖文件大小 = 1024×768×16/8 = 1572864 B = 1536 KB = 1.5 MB。如果要求畫面的刷新率達(dá)到60幀/秒,則每秒需要處理的數(shù)據(jù)量就達(dá)到1.5 * 60 = 90 MB,這個(gè)數(shù)據(jù)是相當(dāng)大。
實(shí)際系統(tǒng)中會通過GPU顯卡處理顯示,減少CPU工作量,或者系統(tǒng)會緩存或局部刷新來降低處理量。沒有研究過,也很想研究一下顯示的流程。
二.Android流暢度的根本:解放UI主線程
1. 不要阻塞UI線程;
2. 不要在UI線程之外操作UI。
三.以ListView加載圖片為例
更流暢?
1. ListView如何流暢順滑加載?
2. ListView使用convertView可以提高兩倍性能?
3. ListView回收item的原理是什么?
4. ListView重復(fù)加載調(diào)用的問題?
5. 如何解決圖片加載OOM問題?
6. 如何更流暢的加載圖片?
7. ListView加載大量圖片并發(fā)問題?
ListView優(yōu)化要點(diǎn)
1. 優(yōu)化Adapter,使用convertView,效率提高2倍;
2. 優(yōu)化item布局,提高整體性能;
3. ListView重復(fù)調(diào)用問題可以設(shè)置layout_height高度固定或者fill_parent,加載的原理;
4. 使用addHeader和addFooter代替ScrollView;
圖片加載優(yōu)化要點(diǎn)
1. 有效加載大圖片,合理設(shè)置BitmapFactory.Options的inSampleSize值,減少圖片內(nèi)存占用;
2. 僅請求圖片的大小,inJustDecodeBounds = true,僅請求圖片大小,而不會加載圖片到內(nèi)存;
3. 緩存圖片,內(nèi)存緩存LruCache,硬盤緩存 DiskLruCache;
4. 使用非UI線程加載圖片,使用 AsyncTask;
5. 使用軟引用SoftReference,綁定ImageView和url,處理ListView并發(fā)加載問
6. Android官方圖片加載利器BitmapFun解析
四.其他
Google官方教程(一定要讀):
Android進(jìn)程和線程-Processes and Threads
改善布局性能-Improving Layout Performance
1. 優(yōu)化布局層次結(jié)構(gòu)—Optimizing Layout Hierarchies
2. 使用標(biāo)簽include重用布局—Re-using Layouts with include
3. 按需加載視圖—Loading Views On Demand
4. ListView的平滑滾動(dòng)—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開發(fā)規(guī)范之編碼規(guī)范
Android開發(fā)性能優(yōu)化簡介
參考:
1. 每秒幀數(shù)
2. 位圖
總結(jié)
以上是生活随笔為你收集整理的[原] Android持续优化 - 提高流畅度的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用nginx阻止别人域名绑定到自己的I
- 下一篇: 【原创】VSFTP: Login fai