2014-03-01 3 views
-1

Я создал небольшую аппликацию (игра), которая повторно использует один и тот же набор изображений несколько раз. SO, я думал, что должен создать класс, который отвечает за загрузку всех разных изображений один раз, из которых я могу получить доступ к ним статически из других классов. Тем не менее, я считаю, что это может вызвать проблемы с сборщиком мусора, что заставляет мое приложение отставать всякий раз, когда выполняется GC. Вот что класс ImgLoader выглядит следующим образом:Загрузка растровых изображений и сохранение их статически альтернатив?

public class ImgLoader extends View { 
public static Bitmap tree1; 

public ImgLoader(Context context) { 
    super(context); 
    loadImgs(); 
} 

public void loadImgs() { 
    System.gc(); // Manually Call GC 

    // TREES 
    tree1 = BitmapFactory.decodeResource(getResources(), R.drawable.tree); 
    tree1 = getResizedBitmap(tree1, MainActivity.height/2, 
      MainActivity.width/10); 
} 

public Bitmap getResizedBitmap(Bitmap bm, int newHeight, int newWidth) { 
    int width = bm.getWidth(); 
    int height = bm.getHeight(); 
    float scaleWidth = ((float) newWidth)/width; 
    float scaleHeight = ((float) newHeight)/height; 
    // CREATE A MATRIX FOR THE MANIPULATION 
    Matrix matrix = new Matrix(); 
    // RESIZE THE BIT MAP 
    matrix.postScale(scaleWidth, scaleHeight); 
    // "RECREATE" THE NEW BITMAP 
    Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height, 
      matrix, false); 
    return resizedBitmap; 
} 

public static Bitmap RotateBitmap(Bitmap source, float angle) { 
    Matrix matrix = new Matrix(); 
    matrix.postRotate(angle); 
    return Bitmap.createBitmap(source, 0, 0, source.getWidth(), 
      source.getHeight(), matrix, true); 
} 

} 

Обратите внимание, я использую только один Bitmap для вопроса. По сути, когда я хочу использовать изображение в моем приложении, я говорю:

object.image = ImgLoader.tree1; 

Что является альтернативой делать это, что это не так интенсивно использующих память?

Спасибо!

ответ

2

Это похоже очень плохая практика для меня, особенно потому, что вы загружаете множественным Bitmaps и держать статические ссылки из них.

Поскольку даже небольшие Bitmaps потребляют значительно большие объемы памяти, вы скоро столкнетесь с OutOfMemoryErrors.

A Bitmap 512x512 уже потребляет 1 мегабайт ОЗУ (в 32 бит) цвет. Вы можете загрузить свои растровые изображения в RGB_565 (16 бит), чтобы уменьшить объем памяти.

Почему бы не просто загрузить Bitmap из Resources, когда вам это нужно?

+0

Я бы сделал это, но мне нужно каждый раз изменять их размер, чтобы подогнать их к экрану. – TastyLemons

+0

Я все еще не понимаю, почему изменение размера растрового изображения требует статической ссылки на него? –

+0

Я просто говорю, поэтому каждый раз, когда я загружаю его, мне нужно будет вызвать метод re-size с ним. Не будет ли это неэффективно? – TastyLemons

0

попробуйте получить их в формате InputStream ... они будут в байте .. но personnaly (и его действительно лично) я предпочитаю загружать каждое изображение, когда мне это нужно, вместо того, чтобы оставлять их в памяти .. для будущего использование изображений, количество изображений может увеличиться, плюс, как и упоминалось, и я заметил в вашем коде, изображения хранятся локально (не загружаются), так что shldnt ba большая проблема перезагрузить их .. но опять же мое собственное мнение

0

Не думайте, что это имеет какое-либо отношение к gc; вы загружаете изображения, когда вы вручную вызываете gc.

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

+0

Я загружаю их только с самого начала. И приложения работают нормально, а затем лагаются каждый раз, когда GC работает. – TastyLemons

+0

Что вы используете для мониторинга сбора мусора? Из вашего кода выше он запускается вручную только при загрузке изображений. – NameSpace

Смежные вопросы