1

我对 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
}

因此,上面的代码将遍历数组中的每个图块(每一帧),并且只绘制某个 X 坐标内的图块。

我只是想知道这是否是这样做的“方式”?- 移动时打开和清空位图?还是有更简单的方法?我是否错过了一个比 null 更好地破坏位图的命令,这会使我的程序更有效率?

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

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

4

1 回答 1

1

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

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

于 2013-01-12T16:36:02.570 回答