Разработка Android: растровые изображения на поверхности видны утечка памяти или слишком большой? - PullRequest
1 голос
/ 05 августа 2011

Моя игра использует SurfaceView (я знаю, что я должен использовать GL).Я рисую множество растровых изображений в своем игровом мире управления персонажами и так далее.И я сталкиваюсь с этим, когда открываю свой LogDog:

08-05 10:17:29.151: ERROR/dalvikvm(24048): Out of memory: Heap Size=5379KB, Allocated=2735KB, Bitmap Size=20576KB, Limit=32768KB

Я не знаю, утечка ли это или что.

Мой трекер распределения показывает:

как 30:

138 96  char[]  9   android.content.res.AssetManager    getCookieName   

Затем Тонны:

32  80  android.graphics.BitmapFactory$Options  9   android.graphics.BitmapFactory  decodeResource  

И последнее: как 30:

141 56  android.graphics.Bitmap 9   android.graphics.BitmapFactory  nativeDecodeAsset   

А также еще несколько симуляций.

Вот некоторый код, который, как мне кажется, истощает мою память:

player = BitmapFactory.decodeResource(getResources(), R.raw.ghostright);
        world = BitmapFactory.decodeResource(getResources(), R.raw.lvl2);
        thumb = BitmapFactory.decodeResource(getResources(), R.raw.thumb);

resized = Bitmap.createScaledBitmap(player, width/10, width/6, false);
         player = resized;


         resized = Bitmap.createScaledBitmap(world, height*10, height, false);
         world = resized;


         resized = Bitmap.createScaledBitmap(thumb, height/6, height/6, false);
         thumb = resized;

Я слышал, что должен использовать resycle, но я не знаю где, потому что я всегда использую растровые изображения

// Simon PS:Мне действительно нужна помощь -.-

Ответы [ 2 ]

1 голос
/ 05 августа 2011

Это не должно быть утечка памяти, возможно, у вас настолько большие растровые изображения, что они хотят выделить много памяти.Вот хороший способ определить, сколько памяти займет растровое изображение: W * H * 8.Поэтому, если у вас есть растровое изображение размером 300 * 300 пикселей, это 300 * 300 * 8 = 720 КБ.

Выясните, сколько выделенной кучи у вас есть в любой момент времени, и посмотрите, увеличивается ли оно со временем, даже если вы знаетечто вы не выделяете новые растровые изображения.Если так, то да, у вас утечка памяти.Однако, если ваше приложение падает сразу при запуске, то вы, вероятно, просто превышаете лимит кучи.

1 голос
/ 05 августа 2011

Я также использую много растровых изображений в SurfaceView, и у меня нет этой проблемы.Когда дело доходит до анимированных спрайтов, вы можете использовать лист спрайтов, а не загружать их по отдельности кадр за кадром.

Вам не нужно использовать ссылку "изменен размер", которую вы можете просто сказать:

player = Bitmap.createScaledBitmap (player, width / 10, width / 6, true );

старое растровое изображение потеряет свою ссылку и будет собрано GC,Обратите внимание, что я установил значение TRUE для фильтрации растровых изображений при изменении масштаба для улучшения качества.

На некоторых устройствах onSizeChanged может происходить два раза, что может приводить к изменению размера растровых изображений в два раза, если вы выполняете масштабирование.1014 * Формат загруженных растровых изображений имеет значение, будь то ARGB_4444 или ARGB_8888 и т. Д. Поэтому вам может потребоваться изучить эту опцию, и если вы можете использовать формат, который требует меньше памяти, но при этом имеет достаточно хорошее качество для вашей игры.Конечно, правило состоит в том, чтобы загружать изображения в память больше, чем нужно и когда они нужны.

...