为啥我的所有位图都被上采样了 200%?
Posted
技术标签:
【中文标题】为啥我的所有位图都被上采样了 200%?【英文标题】:Why are all my bitmaps upsampled 200%?为什么我的所有位图都被上采样了 200%? 【发布时间】:2012-03-26 10:39:45 【问题描述】:我的应用程序 [1] 存在严重的内存问题。为了对此进行调查,我在不同的州对我的应用进行了堆转储。我看到一些位图占用了大量内存。我编写了一个小工具 [2],将字节数组解码为 Windows 位图文件 (.bmp),以便我可以查看位图并将它们与我在 res/drawable
文件夹中的文件进行比较.
我发现我的所有文件都被上采样了两次。 我首先检查了最大的一个:堆中超过 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)而迅速崩溃。我希望有一个原因和解决方法。
参考资料:
-
OutOfMemoryError when loading activities
How to actually see a Bitmap taken from an Android heap dump
【问题讨论】:
您应该在设置样本大小和解码图像时发布您的代码。这应该提供有关此行为的更多信息。这可能是 ICS 问题。 我只是在膨胀几个 ImageView。如果您需要查看一些代码,请检查链接 [1],一切都在那里。 【参考方案1】:当您将图像放入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。
【讨论】:
好的,我明白了。问题是我正在开发的应用程序包含数百张图片,当我说他需要以另一种分辨率完成所有这些图片时,客户不会喜欢。我会找到一个简单的方法,但非常感谢你帮助我!将大图片移动到 drawable-xhdpi 消除了所有内存问题,我低于 40MB,而在此之前我超过 60MB。谢谢。以上是关于为啥我的所有位图都被上采样了 200%?的主要内容,如果未能解决你的问题,请参考以下文章
为啥在使用 FBO 进行多重采样时,OpenGL 会使我的场景变亮?
当我尝试更改采样率时,为啥 sox 会损坏我的 wav 文件?