Android (Java) Битовая манипуляция - управление памятью - PullRequest
0 голосов
/ 25 января 2020

Моя проблема в том, что я не уверен, как обрабатывать растровые изображения в Android (Java). Итак, прежде всего, давайте посмотрим на сам код. У меня есть класс, который обрабатывает растровые изображения.

public class GlowImageFactory {

private Bitmap[] images;

public GlowImageFactory(Context context) {
    this.images = new Bitmap[9];
    initializeImages(context);
}

public void initializeImages(Context context) {
    images[0] = BitmapFactory.decodeResource(context.getResources(), R.drawable.glow1);
    images[1] = BitmapFactory.decodeResource(context.getResources(), R.drawable.glow2);
    images[2] = BitmapFactory.decodeResource(context.getResources(), R.drawable.glow3);
    images[3] = BitmapFactory.decodeResource(context.getResources(), R.drawable.glow4);
    images[4] = BitmapFactory.decodeResource(context.getResources(), R.drawable.glow5);
    images[5] = BitmapFactory.decodeResource(context.getResources(), R.drawable.glow4);
    images[6] = BitmapFactory.decodeResource(context.getResources(), R.drawable.glow3);
    images[7] = BitmapFactory.decodeResource(context.getResources(), R.drawable.glow2);
    images[8] = BitmapFactory.decodeResource(context.getResources(), R.drawable.glow1);
}

public Bitmap getImage(int index) {
    return this.images[index];
}

}

Так вот как я создаю растровые изображения по одному. Мой первый вопрос: нужно ли каким-то образом уничтожать эти растровые изображения в конце? Или уведомить G C, что эти изображения больше не нужны? Например, когда действие уничтожается или что-то в этом роде.

В другом файле я использую этот класс для обработки изображений. Давайте посмотрим код этого второго класса:

public class LaserLineIcon extends Sprite {

private GlowImageFactory glowImageFactory;
private float speed = 3200;
private int frameCounter = 0;
private int counter = 0;

public LaserLineIcon(Context context) {
    this.x = x;
    this.y = y;
    initialize(context);
}

private void initialize(Context context) {

    glowImageFactory = new GlowImageFactory(context);

    setImage(ImageFactory.createImage(context, ImageType.LASER_LINE_ICON));

    setX(RandomGenerator.randomX());
    setY(-getImage().getHeight());
}

@Override
public void move(int x, int y) {
    //laser star coming from the top toward the bottom of the canvas
    this.y += this.speed* Constants.GAME_SPEED;

    if(this.y>= ScreenHelper.getScreenHeight()) {
        this.die();
    }
}

@Override
public void draw(Canvas canvas) {

    counter++;

    canvas.drawBitmap(glowImageFactory.getImage(frameCounter),getX(),getY(),null);

    if(counter%6==0) frameCounter++;

    if(frameCounter>=9) {
        frameCounter = 0;
        counter=0;
    }

    canvas.drawBitmap(getImage(), getX(), getY(), null);
}

}

Так вот, как я рисую растровые изображения (изображения) на холсте с помощью метода draw ().

Каким-то образом память приложения продолжает увеличиваться. Нужно ли вручную освобождать память для растровых изображений? Или какие-то другие операции, которые мне нужно сделать?

(я знаю о проблемах с памятью, потому что я использовал Profiler в Android Studio)

Большое спасибо за все комментарии!

...