我正在尝试为游戏加载背景图像以及一些较小的图像,将它们放置在画布上,让人们与较小的叠加图像进行交互(如移动,旋转)
为了保持宽高比(例如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问题
答案 0 :(得分:1)
鉴于Java代码只允许大约20MB左右的堆大小,你总是会遇到大型位图的问题(除非你在C / C ++ /等中使用本机代码)。
一种方法是使用BitmapFactory加载您的图片,然后在Options中指定一个inSampleSize,以便在读取图片时对其进行缩减采样。这应该避免通过尝试来咀嚼内存加载整个原始图像。甚至还有一个inJustDecodeBounds选项,因此您的代码可以检查图像的尺寸,而不是将它们硬连接到代码中。
答案 1 :(得分:0)
似乎Android上的内存限制介于16 - 24 MB内存之间(取决于设备)。这与设备是否有更多内存无关。此外,Bitmaps使用的内存包含在限制中,导致lang.OutOfMemoryError:位图大小超过VM预算。经过一番搜索,我找到了3个选项:
使用NDK(本机开发工具包)和JNI
对于图像,也可以使用OpenGL纹理,纹理记忆不计入极限。
利用某些位图选项来减小尺寸; http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html
要查看您的应用分配了多少可以使用的内存,android.os.Debug.getNativeHeapAllocatedSize()。