我正在开发一款游戏,该游戏使用带有2000x2000 px图像中的位图的活动。
在HTC Hero中,当我运行活动时,我正在使用12MB。
但是,如果我尝试在具有16MB堆的任何模拟器中运行该应用程序,则VM会由于尝试分配16.4 MB的OutOfMemoryError错误而崩溃;怎么可能?
我也尝试过使用其他模拟器,并使用了20MB。
为了衡量我使用的内存量:
int usedMegs = (int) (Debug.getNativeHeapAllocatedSize() / 1048576L);
String usedMegsString = String
.format(" - Memory Used: %d MB", usedMegs);
getWindow().setTitle(usedMegsString);
为什么同一个位图在HTC Hero中需要12MB,在其他设备中需要20MB?
编辑:我发现这是密度的原因。
密度1 = 12MB,密度0.75 = 8MB和密度1.5 = 20MB(不完全是,某些MB来自其他活动)
我可以说对1.5密度的设备使用1解码位图吗???
编辑2:我在/ drawable中有图像,所以当我用1.5加载图像时,图像变大了。
如果我将图像放在/ drawable-hdpi中,则该图像需要较少的内存(12 MB),因为它没有缩放比例。
最佳答案
您如何将位图加载到内存中?这只是我的推测,但是HTC设备可能正在使用24位色彩空间加载位图,而其他设备正在使用32位色彩空间。每个像素24位的2000x2000位图将使用大约12 MB的内存,而每个像素32位的相同位图将需要接近16 MB的内存。