我决定调查我的应用程序的内存使用情况,我查看了 Android Studio 的内存监视器,发现我的内存使用情况约为 68 MB。我觉得太高了。
我打开内存分配器并从应用程序的开头开始跟踪。我看到有一个 49 MB 的 NonMovableArray
分配,它是一个 Bitmap
。
我调试了应用程序,发现它是我正在使用的背景。下面的行来自 PhoneWindow.java
文件,我相信 Android 就是在其中将背景分配给屏幕的。背景对象的大小为 49 MB,分辨率为 2625x4669。
我的应用程序中没有过度绘制,并且我有一个应用于整个主题的背景。
我在 drawable
文件夹中有一个 JPG 格式、分辨率为 750x1,334 的背景可绘制对象。
PhoneWindow.java
if (mBackgroundResource != 0) {
background = getContext().getDrawable(mBackgroundResource);
} else {
background = mBackgroundDrawable;
}
我正在 Motorola Nexus 6 设备上进行测试,该设备的密度为 560,分辨率为 1440 x 2560。
有两点我不明白。
- 如果设备的分辨率为 1440x2560,为什么我的背景会转换为 2625x4669?
- 即使这种转换对于应用来说是最佳方案,为什么 160 KB 的文件最终会变成 49 MB?
如果你们能向我解释一下,那就太好了。谢谢!
最佳答案
If the device has a resolution of 1440x2560, why would my background get converted to 2625x4669?
您将图像放入 res/drawable/
中。这不是一个好的选择,因为它是 res/drawable-mdpi/的同义词。因此,Android 会重新采样您的图像,认为您的目标是 -mdpi
设备 (~160dpi),因此图像在 Nexus 6 上的物理尺寸大致相同(密度的 3.5 倍)。
res/drawable-nodpi/
或 res/drawable-anydpi/
是否是正确的选择,但在一定程度上取决于此资源的替代版本,either will probably work .
how come a 160 KB file would end up being 49 MB?
该图像在磁盘上占用 160KB。内存占用是解码后的图像。这将是 ARGB_8888
图像的图像分辨率(重采样后)乘以 4 字节/像素。 2625x4669x4 ~= 49MB。
关于java - 为什么我的 160kb 应用程序背景在运行时变成了 49 MB?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35277189/