Итак, я работаю над игрой, которая состоит из двух сеток. Каждая сетка - это 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;
}
Моя главная проблема заключается в том, что по мере заполнения досок игра начнет замедляться по мере продвижения, что может стать проблемой в будущем. Прямо сейчас отставание не очень плохое, но я смог проверить только то, что происходит, когда заполнена только одна доска. Я полагаю, что будет еще хуже, так как обе доски заполнены.
Есть ли проблемы с настройкой моего кода для этого? Или есть более эффективный способ справиться с этим?