內存佔用用手就能算出來

當咱們看完本篇文章,你應該能夠知道:android

  1. 佔用的內存,不是說的圖片的文件大小算法

  2. 咱們能夠在運行時去獲取微信

  3. 要掌握圖片內存大小的計算方法app

1、如何在運行時獲取Bitmap的大小?

  • 獲取圖片實際須要的內存大小優化

   
  1. public final int getByteCount() {spa

  2. if(mRecycled) {.net

  3. return 0;code

  4. }orm

  5. return getRowBytes() * getHeight();blog

  6. }

  • 圖片實際佔用的內存大小

由於存在一個複用的場景,好比以前已經開闢了400KB的大小用來顯示圖片A,如今咱們須要顯示300KB的圖片B,並且圖片A已經不須要顯示了,那麼可能就會將以前開闢的400KB用來顯示圖片B,這樣就不須要從新開闢新的內存,因此圖片B實際佔用的內存400KB。

   
  1. public final int getAllocationByteCount() {

  2. if(mRecycled) {

  3. return 0;

  4. }

  5. return nativeGetAllocationByteCount(mNativePtr);

  6. }

2、圖片的來源

  • Assets中的圖片

     asstes中的文件基本等同於咱們從SDCard中加載的圖片,因此就再也不單獨講解了。

舉個例子:咱們以寬高爲112px * 131px像素的png圖片爲例(文件大小爲20kb),若是咱們使用下面的方式加載到內存中:

BitmapFactory.decodeStream(assets.open("test.png"));

實際上展現的是:以ARGB_8888的格式加載到內存中,那麼最終的大小是112*131*4 = 58688KB。實際上就是咱們圖片須要顯示的總的像素點數乘以單個像素點所佔用的內存,由於ARGB_8888,能夠看出來一個像素的四個通道分別須要8位來描述,因此一個像素點須要4個字節的內存,因此總的像素點數乘以4就是這張圖所佔用的總內存了。

因此,意味着圖片的內存大小除了像素大小外,還和加載到內存的格式有關,好比咱們將上面的圖片換成RGB_565去加載,那麼咱們得出的內存就應該是:112*131*[(5_6+5)/8] = 112*131*2 = 29344個字節,足足比以前小了一半的大小。

  • Drawable目錄中的圖片

     當咱們將圖片放到不一樣的drawable目錄中,最後顯示出來佔用的實際像素是有必定的縮放關係的,仍是以112*131px的圖片爲例:

這麼說吧,若是將上面的圖片放到hdpi目錄下,而後以ARGB_8888加載到內存中佔用的內存大小算法就以下:

(112÷1.5)×(131÷1.5)× 3 × 4 = 77256字節

注意若是放在-nodpi中,那麼圖片在不一樣DPI的設備中不會作任何縮放,都只會以112×131的像素顯示,因此在不一樣手機中永遠佔用相同的內存。

3、優化圖片佔用的內存體積

  • 使用inSampleSize對圖片進行採樣、壓縮

  • 使用矩陣變化來改變圖片大小

  • 使用RGB_565來加載非透明圖片

  • 使用 9-patch圖片來作背景圖

  • 使用VectorDrawable

  • 能不用圖片就不用圖片

  • 感興趣的同窗能夠看下在Android8.1以前可使用的索引模式(IndexedColor)


本文分享自微信公衆號 - IT爛筆頭(nj_android)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索