在Canvas上操作大图像以保持纵横比会导致出现内存问题

时间:2012-04-20 06:23:51

标签: java android

我正在尝试为游戏加载背景图像以及一些较小的图像,将它们放置在画布上,让人们与较小的叠加图像进行交互(如移动,旋转)

为了保持宽高比(例如5:3),我尝试将图像作为位图加载并自己调整大小。我们的想法是根据画布的宽度/高度对背景进行裁剪/装箱,并为较小的图像保持正确的尺寸比例。

Bitmap originalBitmap = BitmapFactory.decodeResource(getResources(), resourceImg);
Bitmap resizedBitmap = Bitmap.createBitmap(bitmapOrg2, 0, 0, width, height, matrix, true);

为了迎合平板电脑/手机,我有一张1600x1000和200kb的背景PNG背景图片。

然而,由于位图为1600x1000x4byte = 6.4 mb ram而且当它尝试调整大小时,我现在正在努力解决内存不足的问题。 (我在发生这些问题时正在使用模拟器)

我决定将其更改为使用canvas.setBackgroundResource

    SceneCanvas sceneCanvas = (SceneCanvas) findViewById(R.id.the_canvas);
    sceneCanvas.setBackgroundResource(R.drawable.my_scene_1600x900);

这很有效,除了填满屏幕并且不保持宽高比。

有没有办法设置背景保持宽高比?或者我完全走错了路线并且应该使用ImageViews并以某种方式渲染到画布以避免OutOfMemory问题

2 个答案:

答案 0 :(得分:1)

鉴于Java代码只允许大约20MB左右的堆大小,你总是会遇到大型位图的问题(除非你在C / C ++ /等中使用本机代码)。

一种方法是使用BitmapFactory加载您的图片,然后在Options中指定一个inSampleSize,以便在读取图片时对其进行缩减采样。这应该避免通过尝试来咀嚼内存加载整个原始图像。甚至还有一个inJustDecodeBounds选项,因此您的代码可以检查图像的尺寸,而不是将它们硬连接到代码中。

答案 1 :(得分:0)

似乎Android上的内存限制介于16 - 24 MB内存之间(取决于设备)。这与设备是否有更多内存无关。此外,Bitmaps使用的内存包含在限制中,导致lang.OutOfMemoryError:位图大小超过VM预算。经过一番搜索,我找到了3个选项:

要查看您的应用分配了多少可以使用的内存,android.os.Debug.getNativeHeapAllocatedSize()。