Java - paintComponent 导致我的程序变慢

Java - paintComponent is causing my program to slow down

所以我正在开发一款由两个网格组成的游戏。每个网格都是一个 JPanel,我在其中(可能)在网格中的每个 space 上绘制一个对象。我发现 PAINTING 对象正在减慢应用程序的速度,我想知道是否有办法防止这种情况发生。

详情:

来自板的 paintComponent class:

//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
                );
            }
        }
    }
}

来自 BoardManager 的 getImage(int, int) class:

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

对象的构造函数class:

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() 来自对象 class:

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;
}

我主要担心的是,随着棋盘被填满,游戏进程会开始变慢,这可能是未来的问题。现在延迟不是很糟糕,但到目前为止我只能测试当只有一块板被填满时会发生什么。我相信随着两个板都被填满,情况会变得更糟。

我的代码为此设置有什么问题吗?或者有没有更有效的方法来处理这个问题?

据我所知,您的 paintComponent() 方法最终会调用:

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

不要在绘画方法中做IO。这会减慢绘画速度。

应该在 class 的构造函数中读取图像。然后绘画方法就可以从您的图像缓存中访问图像。

此外,读入图像时应缩放一次图像。