为什么我的所有位图都上采样200%?

时间:2012-03-08 22:49:43

标签: android memory-management bitmap out-of-memory heap

我的应用程序中存在严重的内存问题[1]。为了研究这个问题,我在不同的州采取了我的应用程序的堆积。我看到一些位图占用了大量内存。我写了一个小工具[2],将字节数组解码为Windows位图文件(.bmp),这样我就可以查看位图并将它们与我{{1}中的文件进行比较}文件夹。

我发现我的所有文件都被上采样了两次 我首先检查了最大的一个:堆中超过9MB的字节数组缓冲区,它被解码为一个漂亮的1920x1280图片,而原始的是一个960x640 png文件。
我尝试了第二大,超过3MB,曾经解码显示一个漂亮的754x1200图片,原始大小是......猜怎么着?一个不错的377x600 jpg文件。

是什么给出了?

我在我的Android Manifest文件中启用了硬件加速(虽然我不确定我真的需要它,我只是使用一些基本的视图和活动)。
我在GSM Galaxy Nexus(yakju)上运行Android 4.0.2。我收到测试人员的反馈,他们的4.0.3 Nexus S上存在问题,但我还是无法检查他们的堆转储。

我正试图在这里节省内存,如果Android将所有内容加倍,难怪应用程序很快崩溃,因为堆使用率过高(在我的情况下大约为64MB)。我希望有一个理由和方法。

参考文献:

  1. OutOfMemoryError when loading activities
  2. How to actually see a Bitmap taken from an Android heap dump

1 个答案:

答案 0 :(得分:8)

当您将图片放入res/drawable时,Android会假设他们的dpi为160,即与将它们放入res/drawable-mdpi相同。 Galaxy Nexus是一个xhdpi设备,即它的(通用)dpi为320.为了补偿高分辨率显示器,Android将以200%对图像进行上采样。

解决方案很简单,只需将图像放入res/drawable-xhdpi即可。然后声明的图像dpi将与您运行的显示匹配,Android将不会执行任何图像缩放。

有关详细信息,请参阅http://developer.android.com/guide/practices/screens_support.html