Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Bitmap size exceeds VM budget when game development

I am developing a game on android.Like tower defense. I am using surface view.I am using some image as bitmap.(Spritesheets, tilesets, buttons, backgrounds,efects vs.) Now images are nearly 5-6 mb.And i get this error when i run my game:

Bitmap size exceeds VM budget

19464192-byte external allocation too large for this process.

I call images like that

BitmapFactory.decodeResource(res, id)

and i put it to array. I can't scale images.I am using all of them. I tried that

options.inPurgeable=true;  

and it work but the image is loading very slowly.I load a spritesheet with that and when it is loading, i get very very low fps.

What can I do?

like image 345
Nafiz Bayındır Avatar asked Mar 31 '12 20:03

Nafiz Bayındır


1 Answers

I've had this problem too; there's really no solution other than to reduce the number/size of bitmaps that you have loaded at once. Some older Android devices only allocate 16MB to the heap for your whole application, and bitmaps are stored in memory uncompressed once you load them, so it's not hard to exceed 16MB with large backgrounds, etc. (An 854x480, 32-bit bitmap is about 1.6MB uncompressed.)

In my game I was able to get around it by only loading bitmaps that I was going to use in the current level (e.g. I have a single Bitmap object for the background that gets reloaded from resources each time it changes, rather than maintaining multiple Bitmaps in memory. I just maintain an int that tracks which resource I have loaded currently.)

Your sprite sheet is huge, so I think you're right that you'll need to reduce the size of your animations. Alternatively, loading from resources is decently fast, so you might be able to get away with doing something like only loading the animation strip for the character's current direction, and have him pause slightly when he turns while you replace it with the new animation strip. That might get complicated though.

Also, I highly recommend testing your app on the emulator with a VM heap set to 16mb, to make sure you've fixed the problem for all devices. (The emulator usually defaults to 24mb, so it's easy for that to go untested and generate some 1-star reviews after release.)

like image 141
Luke Avatar answered Oct 16 '22 08:10

Luke