Я работаю над 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) Мой обычный подход к меняющимся направлениям заключается в замене листа спрайтов на зеркальную копию оригинала. Этот подход отлично подходит для игрока, но для врагов им кажется невозможным, если все они относятся к одному и тому же листу. Нужно ли хранить в памяти как зеркальные, так и незеркальные копии каждого листа спрайтов, или лучше?
3) Является ли что-нибудь сохраненным на нативной куче моим приложением, отличным от Bitmaps? Есть ли способ взглянуть на это и посмотреть, что там? Это примерно на 6 килограмм после того, как я переработал все мои растровые изображения, чтобы загрузить их на новый уровень, я чувствую себя немного выше.
Заранее спасибо!
Во-первых, вы хотите задать вам вопросы: когда произойдет OutOfMemory
? Когда вы загружаете растровые изображения или в середине игры?
Здесь подход, который я использую в течение длительного времени, и мне кажется самым удобным для меня:
Bitmaps
в вашем приложении.Bitmap
вашего BitmapManager
(пусть называют его таким образом) будут общедоступными.Bitmap
внутри своих классов, просто используйте ссылки на объекты BitmapManager
внутри метода onDraw
ваших объектов. При создании зеркальных Bitmaps
обязательно создавайте их во время выполнения. Зеркалируйте их все при загрузке растровых изображений, иначе они убьют ваше приложение. Надеюсь это поможет.