码迷,mamicode.com
首页 > 移动开发 > 详细

关于Android应用中图片占用内存浅谈

时间:2017-06-26 00:40:34      阅读:271      评论:0      收藏:0      [点我收藏+]

标签:帮助   sdcard   bsp   高精度   order   使用   raw   eve   探讨   

   从事过移动端应用开发的童鞋应该都清楚,内存是非常宝贵的资源。如果能很好的利用有限的内存,对应用性能的提升会有很大的帮助。在实际应用开发中图片内存占整个应用非常大的比重,我们只有了解图片是如何加载到内存中,才能更好的优化图片所占的内存。

   那么对于图片在Android应用中的使用进行探讨一下。

   图片所占内存大小=内存中图片高 * 内存中图片宽 * 每个像素所占字节数  

 

 

    1,那么图片的物理高宽和加载到内存中的高宽是否是一样的呢?

    在应用中关于图片的加载一般分为两种情况,其加载到内存中的大小也是不一样的:

       第一种,图片资源放在drawable或mipmap中,通过R.drawable.*或者R.mipmap.*的方式读取。这类多半是应用的切图文件等;

       第二中,非通过R文件获取的图片资源。例如存放在sd文件中或者网络中等;

 

    对于第一种情况,是由系统通过当前设备的density来选择读取对于density目录下的图片资源,资源的匹配是由对应的density目录开始检索,如果对应目录没有则到比当前density小的目录中寻找,只到找到图片为止。

     

属性名 ldpi mdpi hdpi xhdpi xxhdpi xxxhdpi
目录对应DPI 120 160 240 320 480 640

    

      这类加载方式图片在内存中的大小计算公式如下:

                        内存中长度 =( 图片真实长度  /  图片所在目录DPI) * 设备DPI

                        例如:图片的真实高度是192px,图片资源放在xhdpi目录中,测试的设备DPI=560 那么加载到内存中的高度=  (192 / 320) * 480 =288

       对应第二种情况,是由开发者直接指定图片资源的地址,系统不会对图片进行处理:

                        内存中长度= 图片真实长度

                     

 

    2,像素所占字节数是如何计算的呢?

         关于这个问题官网中给了很明确的解释,是通过Bitmap.Config来决定的

    技术分享

             android系统中默认的bitmap.Config是 Bitmap.Config.ARGB_8888 所以每个像素占4个字节

             

 

    

           那我们来验证下上面所说的是否正确:在hdpi,xhdpi,xxhdpi,xxxhdpi已经sdcard中使用同一张图片大小为192px*192px.

           测试的设备为:1080*1920 density=3.0 DPI=480

           技术分享技术分享

 

          由上图可以看到,不同的目录图片所对应的内存大小

           sdcard:  高宽=  192px                                            内存=192*192*4 = 144kb

           hdpi :         高宽 = (192 /240 )*480=384px                            384*384*4=576kb

           xhdpi:        高宽 = (192/320)*480=288px                           288*288*4=324kb

          xxhdpi:       高宽 = (192/480)*480 = 192px                         192*192*4=144kb

         xxxhdpi:      高宽 = (192/640)*480 = 144px                          144*144*4=81kb

 

为了验证在实际运行中图片所在内存是否符合我们的计算公式,我们可以利用AS的监控功能dump出运行时的dump文件进行分析验证。

        技术分享

技术分享

        通过验证可以得知图片所占的内存大小符合前面的公式:192*192*4=147456B

 

    最后对在应用中使用图片的有些建议:

      1,切图资源不能随便乱放文件夹,最好按照对应的切图放到对应的文件家中,避免因为访问其他文件加导致图片所占内存增大。

      2,对于只有一套切图资源来说,尽量选择高精度的尺寸切图。参考当前主流设备的设备信息选择对应的精度作为切图标准。目前我以xxhdpi作为切图标准

      3,对应非同R文件引用的图片,可以选择设置Bitmap.Config属性控制图片内存大小,可以选择Bitmap.Config.RGB_565的方式,相比默认的Bitmap.Config.ARGB_8888将会减少一半的内存占用

 

关于Android应用中图片占用内存浅谈

标签:帮助   sdcard   bsp   高精度   order   使用   raw   eve   探讨   

原文地址:http://www.cnblogs.com/whroid/p/7078535.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!