我正在做的项目使用了几个“高分辨率”的背景(注意引号)。为了了解情况,其中之一是一个640x935 1.19M的PNG文件。据我所知,即使Android将图像解压到内存中作为原始数据,这也应该是:
640 x 935 x 4字节= 2.39M
我在我的项目中遇到了记忆问题,我真的不能理解,我希望有人能对这件事有所了解。我将列出我正在开发的两个设备和一些结果。
为了确保这不是一个次要问题,我让一个活动在第一次创建时不加载背景,然后,当用户按下一个按钮时,它所做的就是:
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,但这会产生一些我无法接受的条带问题)。
如果无能为力,我也会接受对为什么会发生这种情况的解释。提前谢谢。
发布于 2012-10-29 19:42:39
这就是为什么
把图像做得这么大吗?
现在的情况是,setBackgroundResource(R.drawable.blockbackgroundbottom1)
会让安卓系统先做你尝试过的BitmapFactory.decodeResource()
操作,然后让渲染逻辑缩放图像以将其作为背景。因此,例如,Galaxy Nexus和Nexus之间的3MB差异可能反映了LinearLayout
的不同版本之间的大小差异。
还可能会根据屏幕密度进行一些重采样,这取决于您在资源树中存储此图像的位置。
有没有办法让它以任何方式保持原始图像的大小?
现成的,我会先试着把它放在res/drawable-nodpi/
中(以防止任何基于密度的自动重采样),然后通过接受BitmapFactory.Options
的BitmapFactory.decodeResource()
版本手动获取Bitmap
,这样您就可以在读取时对其进行缩放。如果这似乎没有多大帮助,您可能需要将PNG从可提取的资源中移到原始资源或资产中,因为Android可能仍然会尝试保留图像的未缩放副本。我认为如果你自己直接使用BitmapFactory.decodeResource()
就不会,但我不能排除它的可能性。
https://stackoverflow.com/questions/13118005
复制相似问题