我正在开发一个Android游戏。当我尝试使用3张1280x720像素且大小为100kb的图片作为背景时,问题出现了。
这些图片并不是很大,所以我有点困惑为什么它们会引起内存问题。
注意:屏幕分辨率为800x400,因此我无法将图像按2倍比例调整大小,正如 Android开发人员建议的建议。
注意:我正在使用HTC Desire手机(在这里崩溃),我还尝试在三星Galaxy S1上运行它,在三星上它可以正常工作。
我已经在DDMS中分析了内存,奇怪的是我发现Heap只有3.5mb左右。如果我检查rt.MaxMemory(),它说我每个应用程序有约25mb的空间。
我想到的是堆没有足够快地"更新"以适应更大的照片/应用程序,因此尽管很小,但在加载图像之前就会崩溃。是否有任何方法手动设置堆大小,或者至少告诉它扩大?
以下是我加载图像的代码:
编辑: 既然你说位图使用的是“原始”图像大小而不是压缩后的大小,这就有意义了。经过一些研究,似乎在Android 2.2和2.3上,位图不存储在堆中,因此在加载图像后堆不会增加。
我还有一个问题。我们使用这三张图片作为背景。现在我们会在垂直方向上稍微调整它们的大小,但在水平方向上我们仍然需要它们保持原样。因此,图像仍将约为100x720px。我们需要3张图片的原因是,这样我们可以单独绘制它们并获得层效果(我们可以在两张图片之间绘制某些内容)。实现此目标并尽可能少地使用内存的最佳方法是什么?
背景:
中间:
前景:
注意:这只是静态背景,动画发生在它们周围和之间。
这些图片并不是很大,所以我有点困惑为什么它们会引起内存问题。
注意:屏幕分辨率为800x400,因此我无法将图像按2倍比例调整大小,正如 Android开发人员建议的建议。
注意:我正在使用HTC Desire手机(在这里崩溃),我还尝试在三星Galaxy S1上运行它,在三星上它可以正常工作。
我已经在DDMS中分析了内存,奇怪的是我发现Heap只有3.5mb左右。如果我检查rt.MaxMemory(),它说我每个应用程序有约25mb的空间。
我想到的是堆没有足够快地"更新"以适应更大的照片/应用程序,因此尽管很小,但在加载图像之前就会崩溃。是否有任何方法手动设置堆大小,或者至少告诉它扩大?
以下是我加载图像的代码:
Bitmap floorFront = BitmapFactory.decodeResource(host.getResources(), R.drawable.floor1);
floorFront = Bitmap.createScaledBitmap(floorFront,host.realWidth,host.realHeight, true);
floorFront = Bitmap.createBitmap(floorFront, 0, host.realHeight/2, host.realWidth, host.realHeight/2);
host.addInstance(new Background(0,host.realHeight/2,host,floorFront,1));
Bitmap floorBack = BitmapFactory.decodeResource(host.getResources(), R.drawable.sand);
floorBack = Bitmap.createScaledBitmap(floorBack,host.realWidth,host.realHeight, true);
floorBack = Bitmap.createBitmap(floorBack, 0, host.realHeight/2, host.realWidth, host.realHeight/2);
host.addInstance(new Background(0,host.realHeight/2,host,floorBack,4));
Bitmap floorRock = BitmapFactory.decodeResource(host.getResources(), R.drawable.foreground);
floorRock = Bitmap.createScaledBitmap(floorRock,host.realWidth,host.realHeight, true);
floorRock = Bitmap.createBitmap(floorRock, 0, host.realHeight/2, host.realWidth, host.realHeight/2);
host.addInstance(new Background(0,host.realHeight/2,host,floorRock,0));
这里是来自LogCat的精确错误:
maxMemory:25165824
memoryClass:24
6144000-byte external allocation too large for tgis process.
Out of memory: Heap Size=4739KB, Allocated=2399KB, Bitmap Size=18668KB
VM won't let use allocate 6144000bytes
编辑: 既然你说位图使用的是“原始”图像大小而不是压缩后的大小,这就有意义了。经过一些研究,似乎在Android 2.2和2.3上,位图不存储在堆中,因此在加载图像后堆不会增加。
我还有一个问题。我们使用这三张图片作为背景。现在我们会在垂直方向上稍微调整它们的大小,但在水平方向上我们仍然需要它们保持原样。因此,图像仍将约为100x720px。我们需要3张图片的原因是,这样我们可以单独绘制它们并获得层效果(我们可以在两张图片之间绘制某些内容)。实现此目标并尽可能少地使用内存的最佳方法是什么?
背景:
![background](https://istack.dev59.com/NwPsw.webp)
![middle](https://istack.dev59.com/kwV6K.webp)
![foreground](https://istack.dev59.com/gBWST.webp)