重用Android中的位图

时间:2012-01-26 06:59:17

标签: java android memory

我正在开发Android游戏(2d平台游戏)并遇到内存不足问题。我已尽我所能减少在给定时间内存储在内存中的位图数量,但我仍然遇到问题。几个快速的问题。

1)以下代码是否正确地为每个敌人实例使用一个Bitmap?

Bitmap pusher2 = BitmapFactory.decodeResource(res, R.drawable.pusher_white);
Bitmap stinger2 = BitmapFactory.decodeResource(res,R.drawable.stinger_glow_v2_135x135)
Bitmap lightTrap2 = BitmapFactory.decodeResource(res, R.drawable.light_trap_v3_64x33); 

Enemy e21 = new Enemy(assets, pusher2, Enemy.SLIME, 32, 42, 12, 12, 17*32, 61*32-32, -50, 0);
Enemy e22 = new Enemy(assets, pusher2, Enemy.SLIME, 32, 42, 12, 12, 27*32, 57*32-32, -50, 0);
Enemy e23 = new Enemy(assets, pusher2, Enemy.SLIME, 32, 42, 12, 12, 47*32, 34*32-32, -50, 0);
Enemy e24 = new Enemy(assets, pusher2, Enemy.SLIME, 32, 42, 12, 12, 10*32, 29*32-32, -50, 0);
Enemy e25 = new Enemy(assets, pusher2, Enemy.SLIME, 32, 42, 12, 12, 19*32, 29*32-32, 50, 0);
Enemy e26 = new Enemy(assets, pusher2, Enemy.SLIME, 32, 42, 12, 12, 35*32, 20*32-32, -50, 0);
Enemy e27 = new Enemy(assets, stinger2, Enemy.STINGER, 135, 135, 22, 22, 32*32, 57*32-135, 144, 0, 23*32, 42*32);
Enemy e28 = new Enemy(assets, stinger2, Enemy.STINGER, 135, 135, 22, 22, 30*32, 40*32-135, 144, 0, 26*32, 41*32);
Enemy e29 = new Enemy(assets, stinger2, Enemy.STINGER, 135, 135, 22, 22, 35*32, 6*32-135, 144, 0);
Enemy e2a = new Enemy(assets, lightTrap2, Enemy.LIGHT_TRAP, 33, 64, 5, 24, 30*32, 21*32-33, 0, 0);
Enemy e2b = new Enemy(assets, lightTrap2, Enemy.LIGHT_TRAP, 33, 64, 5, 24, 40*32, 21*32-33, 0, 0);
Enemy e2c = new Enemy(assets, lightTrap2, Enemy.LIGHT_TRAP, 33, 64, 5, 24, 34*32, 13*32-33, 0, 0);

2)我改变方向的常用方法是用原始的镜像副本替换精灵表。这种方法对于玩家来说非常有用,但如果他们都指的是同一张牌,对敌人来说似乎是不可能的。我是否需要将每个敌人精灵表的镜像和非镜像副本存储在内存中,还是有更好的方法?

3)除Bitmaps以外,我的应用程序是否存储在本机堆上?有没有办法看看它,看看那里有什么?在我将所有位图重新加载到一个新的水平之后大约6k,我觉得这有点高..

提前致谢!

1 个答案:

答案 0 :(得分:1)

首先,想问你一个问题:OutOfMemory何时发生?当你加载位图时,或者在游戏中间?

这是我长期使用的方法,对我来说似乎最方便:

  1. 创建一个将加载和卸载应用程序中所有Bitmaps的类。
  2. Bitmap(我们称之为那种方式)类的BitmapManager个对象的引用公开。
  3. 不要在类中包含对Bitmap个对象的引用,只需使用对象BitmapManager方法中onDraw个对象的引用。
  4. 创建镜像Bitmaps时,请确保不要在运行时创建它们。加载位图时将它们全部镜像,否则它们会杀死你的应用程序。希望这会有所帮助。