I’m working with a sloppy code for a game and it causes OutOfMemoryError: bitmap size exceeds VM budget.
If I’m right the VM budget is 16 MB.
I’m having trouble getting it straight, my MainPanel class is extending SufaceView and implements SurfaceHolder.Callback.
The problem is I need to get to the bitmaps from another class. I’m guessing this should not be hard?
I have a class named EnemyCreator which spawns the enemies, and the Entity (enemy) needs a bitmap to be created. But how do I make a new bitmap in EnemyCreator instead of in MainPanel?
Right now the Bitmaps are static in MainPanel which I’m guessing is bad design and will cause the sort of memory leaks the game suffers from (the problem states: android.graphics.Bitmap.nativeCreate(Native Method) ).
Example MainPanel:
public static Bitmap ufoShieldBitMap = (BitmapFactory.decodeResource(getResources(), R.drawable.ufo_shield, optionsAlpha));
public static Bitmap explosion_SmallBitmap = (BitmapFactory.decodeResource(getResources(), R.drawable.explosion, options));
Example EnemyCreator:
private void createAstroid() {
int randomAstroid = this.random.nextInt(astroidCount);
int randomXpos = this.random.nextInt(BackgroundManager.INSTANCE.screenWidth - 40);
switch(randomAstroid) {
case 0:
new EnemyAstroid(MainPanel.astroidBitmap, randomXpos, SPAWN_Y, 17, 17); // X, Y, FPS, FrameCount
break;
}
Anyone have suggestions?
for your note.
just create one Bitmap object for one class/type.
no need to recreate it everytime you create a new object. the bitmap is reuseable and the canvas can draw it as much as it needed.
I realized this because I’ve had the same issue before