Java - paintComponent вызывает замедление моей программы - PullRequest
0 голосов
/ 01 мая 2018

Итак, я работаю над игрой, которая состоит из двух сеток. Каждая сетка - это JPanel, где я рисую объект поверх (возможно) каждого пространства в сетке. Я обнаружил, что PAINTING объект замедляет работу приложения, и мне было интересно, есть ли способ предотвратить это.

Подробности:

  • каждая сетка имеет размер 6x12, поэтому потенциально 144 объекта (крайний случай) плюс фон будут закрашены сразу на весь кадр.

  • каждый нарисованный объект представляет собой файл изображения 16x16, который масштабируется в зависимости от размера, не знаю, насколько это актуально, но я предоставил конструктор для класса объекта на тот случай, если он может иметь что делать с инициализацией изображения?

  • Не знаю, как это объяснить, но изображение никогда не сохраняется в объекте. Функция getImage () создает и возвращает изображение, когда оно вызывается другим классом.

  • В настоящее время проект настроен на инициализацию массива объектов при запуске игры. Он не замедляется, пока не переключится на доску JPanel и объекты не будут окрашены.

  • Объекты раскрашиваются только один раз, когда отображается доска JPanel

Компонент краски из класса Board:

//public Board extends JPanel

// boardManager holds an array of the objects
@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    for(int i = 0; i < 12; i++) {
        for(int j = 0; j < 6; j++) {
            if(boardManager.getVisibility(i, j)) {
                g.drawImage(
                    boardManager.getImage(i, j),
                    boardManager.getX(i, j),
                    boardManager.getY(i, j),
                    this
                );
            }
        }
    }
}

getImage (int, int) из класса BoardManager:

public Image getImage(int x, int y) {
    return grid[x][y].getImage();
}

Конструктор из класса Object:

private int current;

public Object(Game frame, int x, int y, String c, Boolean vis) {
    this.frame = frame;
    xPos = x;
    yPos = y;
    color = c;
    visible = vis;
    current = 01;

    imgPath = "/game/img/" + color + "/";
}

getImage () из класса Object:

public Image getImage() {
    try {
        BufferedImage img = ImageIO.read(this.getClass().getResource(imgPath + current + ".png"));
        Image scaledImg = img.getScaledInstance(16 * frame.scale, 16 * frame.scale, Image.SCALE_FAST);
        return scaledImg;
    }
    catch(IOException | IllegalArgumentException ex) {
        System.err.println("Error: file not found " + imgPath + current + ".png");
    }
    return null;
}

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

Есть ли проблемы с настройкой моего кода для этого? Или есть более эффективный способ справиться с этим?

1 Ответ

0 голосов
/ 01 мая 2018

Из того, что я могу сказать, ваш метод paintComponent () в конечном итоге вызывает:

BufferedImage img = ImageIO.read(this.getClass().getResource(imgPath + current + ".png"));

Не делай IO в методе рисования. Это замедлит картину.

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

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

...