Android 性能优化——之图片的优化
Android?性能優(yōu)化——之圖片的優(yōu)化
?在Android性能優(yōu)化中,我們會發(fā)現(xiàn)占內(nèi)存最大的和對性能影響最大的往往是圖片資源,其次是控件資源。相對來說,其他的資源的影響會小一點(diǎn)。這里我就先對圖片資源的優(yōu)化進(jìn)行一下講解,如果有什么說的不對的,希望大神指正一下。
1、首先我們可以對圖片進(jìn)行二次采樣,從本質(zhì)上減少圖片的內(nèi)存占用。就是將大圖片縮小之后放入到內(nèi)存中,以實(shí)現(xiàn)減小內(nèi)存的目的。代碼如下:
1 //創(chuàng)建縮略圖 2 private Bitmap onCreateThumbnail(String filePath2, int i) { 3 4 //得到選項(xiàng) 5 BitmapFactory.Options options=new BitmapFactory.Options(); 6 //設(shè)置為不讀內(nèi)容,值讀取邊界值 7 options.inJustDecodeBounds=true; 8 //通過編輯,得到邊界值,并存入到option中 9 BitmapFactory.decodeFile(filePath2,options); 10 //得到縮放比例 11 int ratiowidth=(options.outWidth)/i; 12 //賦值縮放比例 13 options.inSampleSize=ratiowidth; 14 //設(shè)置顯示的圖片格式 15 options.inPreferredConfig=Config.RGB_565; 16 //設(shè)置為讀取內(nèi)容, 17 options.inJustDecodeBounds=false; 18 //得到縮略圖 19 return BitmapFactory.decodeFile(filePath2, options); 20 }?
當(dāng)然現(xiàn)在有很多的第三方框架可以快速的實(shí)現(xiàn)這個(gè)功能,如Picasso等,其用法只是調(diào)用一下方法就可以了,相當(dāng)對來說更容易(不會的朋友,可以在網(wǎng)上搜一下,很簡單實(shí) 用的框架)。
2、其次就是采用三層緩存架構(gòu),提高圖片的訪問速度。三層緩存架構(gòu)是內(nèi)存-文件-網(wǎng)絡(luò)。
內(nèi)存是訪問速度最快的部分但是分配的空間有限,所以不可能占用太多。其中內(nèi)存緩存可以采用LRU算法(最近最少使用算法),來確定要刪除內(nèi)存中的那些圖片,保存那 些圖片。
文件就是將圖片保存到本地,可以使SD卡中,也可以是手機(jī)內(nèi)部存儲中。
網(wǎng)絡(luò)就是訪問網(wǎng)絡(luò)下載圖片,進(jìn)行圖片的加載。
3、常見的png,JPG,webp等格式的圖片在設(shè)置到UI上之前需要經(jīng)過解碼過程,而圖片采用不同的碼率,也會造成對內(nèi)存的占用不同。下面介紹幾種常見的解碼率:
1)ALPHA_8格式的解碼率,此時(shí)圖片只有alpha值,沒有RGB值,一個(gè)像素占用一個(gè)字節(jié),內(nèi)存占用是最小的,但是也是最不清晰的一種,極易照成畫面失真,不建議使 用。
2)ARGB_4444?格式的解碼率,這種格式的圖片,看起來質(zhì)量太差,已經(jīng)不推薦使用。?而強(qiáng)烈推薦使用ARGB_8888來代替。一個(gè)像素占用2個(gè)字節(jié),alpha(A) 值,Red(R)值,Green(G)值,Blue(B)值各占4個(gè)bites?。?共16bites,即2個(gè)字節(jié)
3)ARGB_8888?格式的解碼率,一個(gè)像素占用4個(gè)字節(jié),alpha(A)值,Red(R)值,Green(G)值,Blue(B)值各占8個(gè)bites?,?共32bites?,?即4個(gè)字節(jié)。這是一種高 質(zhì)量的圖片格式,電腦上普通采用的格式。它也是Android手機(jī)上一個(gè)BitMap的默認(rèn)格式。
4)RGB_565格式的解碼率,一個(gè)像素占用2個(gè)字節(jié),沒有alpha(A)值,即不支持透明和半透明,?Red(R)值占5個(gè)bites?,Green(G)值占6個(gè)bites?,Blue(B)值占5 個(gè)bites,共16bites,即2個(gè)字節(jié)。?對于半透明顏色的圖片來說,該格式的圖片能夠達(dá)到比較好的呈現(xiàn)效果,相對于ARGB_8888來說也能減少一半的內(nèi)存開銷,因此它是一 個(gè)不錯(cuò)的選擇。
總的來說,比較推薦用最后一種,性能較好,且沒有alpha值,系統(tǒng)不用進(jìn)行二次的渲染,可以很大的提高效率和性能。
?
4、最后一點(diǎn),也是圖片優(yōu)化最重要的一點(diǎn)。重用Bitmap.
我們都知道bitmap會占用大量的內(nèi)存空間,如下圖:
?
所以可以重用已存在的bitmap內(nèi)存區(qū)域。通過inBitmap屬性可以使提升Bitmap循環(huán)效率。內(nèi)存使用如下圖:
?
使用這個(gè)屬性,可以告知Bitmap解碼器去嘗試使用已經(jīng)存在的內(nèi)存區(qū)域,新解碼的bitmap會嘗試去使用之前那張bitmap在heap中所占據(jù)的pixel?data內(nèi)存區(qū)域,而不是去問內(nèi)存 重新申請一塊區(qū)域來存放bitmap。利用這種特性,即使是上千張的圖片,也只會僅僅只需要占用屏幕所能夠顯示的圖片數(shù)?量的內(nèi)存大小。
代碼:
//得到選項(xiàng) BitmapFactory.Options options=new BitmapFactory.Options();options.inBitmap=mCurrentBitmap;mCurrentBitmap=BitmapFactory.decodeFile(filename,options);?
?
使用這個(gè)屬性需要注意一下幾個(gè)限制條件:
1、在SDK?11?->?18之間,重用的bitmap大小必須是一致的,例如給inBitmap賦值的圖片大小為100-100,那么新申請的bitmap必須也為?100-100才能夠被重用。從 SDK?19開始,新申請的bitmap大小必須小于或者等于已經(jīng)賦值過的bitmap大小。
2、新申請的bitmap與舊的bitmap必須有相同的解碼格式,例如大家都是8888的,如果前面的bitmap是8888,那么就不能支持4444與565格式的bitmap了。
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/zxxiaoxia/p/4508095.html
總結(jié)
以上是生活随笔為你收集整理的Android 性能优化——之图片的优化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Chrome 自动填充的表单是淡黄色的背
- 下一篇: 腾达 FH304 无线路由器自动获取IP