java - 在 Android 中重用位图

标签 java android memory

我正在开发一款 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是什么时候发生的?当您加载位图时,还是在游戏进行时?

这是我使用了很长时间的方法,它对我来说似乎是最方便的:

  1. 创建一个类,用于加载和卸载应用程序中的所有位图
  2. 公开对 BitmapManager(让我们这样调用它)类的 Bitmap 对象的引用。
  3. 不要在你的类中保留对 Bitmap 对象的引用,只需在 onDraw 方法中使用对 BitmapManager 对象的引用你的对象。

创建镜像位图时,请确保不要在运行时创建它们。加载位图时将它们全部镜像,否则它们会杀死你的应用程序。希望这会有所帮助。

关于java - 在 Android 中重用位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9014839/

相关文章:

java - PlayN JBox2D Y 速度增加但发生碰撞

java - 通过接口(interface)引用对象。总是?

android - 如何在媒体播放器中更改字幕

iphone - 通过分割 .xib 文件来减少内存使用?

java - 减少测试条件和更新值时的重复方法调用(java)

java - 使用 JPA 和 Spring 3 的 Spring MVC 中没有正在进行的事务

android - 在android中的更改 Activity 上滑动xml动画

android - 如何正确扩展布局类?

c - 堆栈帧组装 - 堆栈上的缓冲区/垃圾空间和参数位置 - Ubuntu x64

c - C中如何确定空数组的值