首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Android背景图片内存使用情况

Android背景图片内存使用情况
EN

Stack Overflow用户
提问于 2012-10-29 16:17:29
回答 1查看 16.7K关注 0票数 59

我正在做的项目使用了几个“高分辨率”的背景(注意引号)。为了了解情况,其中之一是一个640x935 1.19M的PNG文件。据我所知,即使Android将图像解压到内存中作为原始数据,这也应该是:

640 x 935 x 4字节= 2.39M

我在我的项目中遇到了记忆问题,我真的不能理解,我希望有人能对这件事有所了解。我将列出我正在开发的两个设备和一些结果。

为了确保这不是一个次要问题,我让一个活动在第一次创建时不加载背景,然后,当用户按下一个按钮时,它所做的就是:

代码语言:javascript
复制
findViewById(R.id.completed_block_background).setBackgroundResource(R.drawable.blockbackgroundbottom1);

然后,在进程上使用带有"Update Heap“的DDMS (并首先强制GC确保这不会成为问题),我将获得以下内存结果:

Nexus S:从18M增加到26M (相差8M)

Galaxy Nexus:从28M增加到39M (相差11M)

因此,正如您所看到的,将理论上2.39M的未压缩图像放到背景中实际上会增加8M和11M的内存使用量。有人能解释一下为什么会这样吗?是否有任何解决方案?

我能找到的唯一解决方案是使用位图将分辨率减半或降低通道格式(到目前为止,这就是我所做的,将它们切换到565 RGB,但这会产生一些我无法接受的条带问题)。

如果无能为力,我也会接受对为什么会发生这种情况的解释。提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-29 19:42:39

这就是为什么

把图像做得这么大吗?

现在的情况是,setBackgroundResource(R.drawable.blockbackgroundbottom1)会让安卓系统先做你尝试过的BitmapFactory.decodeResource()操作,然后让渲染逻辑缩放图像以将其作为背景。因此,例如,Galaxy Nexus和Nexus之间的3MB差异可能反映了LinearLayout的不同版本之间的大小差异。

还可能会根据屏幕密度进行一些重采样,这取决于您在资源树中存储此图像的位置。

有没有办法让它以任何方式保持原始图像的大小?

现成的,我会先试着把它放在res/drawable-nodpi/中(以防止任何基于密度的自动重采样),然后通过接受BitmapFactory.OptionsBitmapFactory.decodeResource()版本手动获取Bitmap,这样您就可以在读取时对其进行缩放。如果这似乎没有多大帮助,您可能需要将PNG从可提取的资源中移到原始资源或资产中,因为Android可能仍然会尝试保留图像的未缩放副本。我认为如果你自己直接使用BitmapFactory.decodeResource()就不会,但我不能排除它的可能性。

票数 116
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13118005

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档