0

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

为了保持纵横比(例如 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 和更多内存,我现在正在努力解决内存不足的问题。(发生这些问题时,我正在使用模拟器)

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

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

这很好用,除了它填满屏幕并且不保持纵横比。

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

4

2 回答 2

1

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

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

于 2012-04-22T09:11:31.477 回答
0

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

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

于 2012-04-22T14:23:27.187 回答