我正在开发一款 Android 游戏(2d 平台游戏),但遇到了内存不足的问题。我已尽我所能减少给定时间存储在内存中的位图数量,但我仍然遇到问题。几个简单的问题。
1) 以下代码是否正确地为敌人的每个实例使用一个位图?
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) 我通常改变方向的方法是用原始的镜像副本替换 sprite 表。这种方法对玩家很有效,但如果敌人都指的是同一张纸,那么对他们来说似乎不可能。我是否需要在内存中存储每个敌人 Sprite 表的镜像和非镜像副本,还是有更好的方法?
3) 除位图外,我的应用程序是否在 native 堆上存储了任何内容?有什么方法可以查看它并查看其中的内容吗?在我回收我所有的位图以加载到一个新的关卡后大约是 6k,我觉得这有点高..
提前致谢!
最佳答案
首先,想问你一个问题:OutOfMemory
是什么时候发生的?当您加载位图时,还是在游戏进行时?
这是我使用了很长时间的方法,它对我来说似乎是最方便的:
- 创建一个类,用于加载和卸载应用程序中的所有
位图
。 - 公开对
BitmapManager
(让我们这样调用它)类的Bitmap
对象的引用。 - 不要在你的类中保留对
Bitmap
对象的引用,只需在onDraw
方法中使用对BitmapManager
对象的引用你的对象。
创建镜像位图
时,请确保不要在运行时创建它们。加载位图时将它们全部镜像,否则它们会杀死你的应用程序。希望这会有所帮助。
关于java - 在 Android 中重用位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9014839/