创建/导入许多位图用于maptiles堆栈内存问题

时间:2013-01-12 16:25:56

标签: android bitmap

我对Android很陌生,但我想尝试制作一个基于平铺的游戏,你可以在地图上移动,一个个正方形。

然而,我在打开许多资源方面遇到了问题,现在我只是为每个图块使用相同的图像(但将来这显然会改变)

问题是在创建一个尺寸合适的地图时这段代码:

mBitmap = BitmapFactory.decodeStream(new BufferedInputStream(res.openRawResource(R.drawable.tile)));
mBitmap = Bitmap.createBitmap(mBitmap, 0, 0, mBitmap.getWidth(), mBitmap.getHeight());
canvas.drawBitmap(mBitmap, mX, mY, null);

在模拟时导致错误...

据我所知,仿真器/手机的内存有限,但我认为它们足以容纳20x20的磁贴?

- 我希望有更大的地图,但我能想到的唯一解决办法就是一旦它们不在视野中就会摧毁它们并在它们进入视野时绘制新的地图(当你移动时)

我试图在这里做到这一点:

if (tile.mX > 100 && tile.mX < 600){
   tile.mBitmap = null;
} else {
   //draw it with code above
}

所以上面的代码会循环遍历数组中的每个tile(每一帧),并且只绘制某个X坐标中的那些。

我只是想知道这是否是'方式'呢? - 移动时打开和归零位图?还是有更简单的方法?我是否错过了一个比null更能破坏位图的命令,这会使我的程序更有效率?

程序在模拟器上运行速度非常慢,这是一个问题吗? - 假设在模拟器上每帧加载很多位图是否安全?手机设备上的运行速度是否仍然很慢?

任何提示/帮助都会很棒,谢谢!

1 个答案:

答案 0 :(得分:1)

我不认为你每次都必须加载/释放位图。我还编写了一个处理大量(大)位图的程序,我遇到了很多内存问题,直到我偶然发现了Android API提供的LruCache类(链接的JavaDoc甚至有一个如何使用它的例子)用于位图)。 LRU代表最近最少使用,所以基本上它保留了很快使用的元素并删除了很长时间未使用的元素。

所以你应该做的是:你将使用SurfaceView绘制你的游戏场 - 这意味着你每次调用draw方法时都必须绘制它。所以在绘图时,你必须知道哪些瓷砖是可见的,你只需要绘制这些瓷砖。对于每个图块,您都会查看LruCache以查看是否已经加载了该位图,如果已经加载,只需将其绘制在曲面视图的正确位置即可。如果位图不在缓存中,则加载它,将其放入缓存并将其绘制到表面上。