前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >内存占用用手就能算出来

内存占用用手就能算出来

作者头像
吴延宝
发布2020-08-31 12:52:51
6600
发布2020-08-31 12:52:51
举报

当我们看完本篇文章,你应该可以知道:

  1. 占用的内存,不是说的图片的文件大小
  2. 我们可以在运行时去获取
  3. 要掌握图片内存大小的计算方法

一、如何在运行时获取Bitmap的大小?

  • 获取图片实际需要的内存大小
代码语言:javascript
复制
public final int getByteCount() {if(mRecycled) {return 0;}return getRowBytes() * getHeight();}
  • 图片实际占用的内存大小

因为存在一个复用的场景,比如之前已经开辟了400KB的大小用来显示图片A,现在我们需要显示300KB的图片B,而且图片A已经不需要显示了,那么可能就会将之前开辟的400KB用来显示图片B,这样就不需要重新开辟新的内存,所以图片B实际占用的内存400KB。

代码语言:javascript
复制
public final int getAllocationByteCount() {if(mRecycled) {return 0;}return nativeGetAllocationByteCount(mNativePtr);}

二、图片的来源

  • Assets中的图片

asstes中的文件基本等同于我们从SDCard中加载的图片,所以就不再单独讲解了。

举个例子:我们以宽高为112px * 131px像素的png图片为例(文件大小为20kb),如果我们使用下面的方式加载到内存中:

代码语言:javascript
复制
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的像素显示,所以在不同手机中永远占用相同的内存。

三、优化图片占用的内存体积

  • 使用inSampleSize对图片进行采样、压缩
  • 使用矩阵变化来改变图片大小
  • 使用RGB_565来加载非透明图片
  • 使用 9-patch图片来做背景图
  • 使用VectorDrawable
  • 能不用图片就不用图片
  • 感兴趣的同学可以看下在Android8.1之前可以使用的索引模式(IndexedColor)
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-08-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT烂笔头 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、如何在运行时获取Bitmap的大小?
  • 二、图片的来源
  • 三、优化图片占用的内存体积
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档