Java - paintComponent导致我的程序变慢

时间:2018-05-01 04:06:17

标签: java swing graphics paint paintcomponent

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

详细信息:

  • 每个网格为6x12,因此可能会有144个对象(极端情况)加上背景一次性涂在整个框架上。

  • 绘制的每个对象都是一个16x16图像文件,根据大小放大,不知道这是否相关,但我提供了对象类的构造函数,以防万一可能与初始化图像有关吗?

  • 不知道如何解释这个,但Image永远不会保存在对象中。 getImage()函数在被另一个类调用时创建并返回Image。

  • 目前,项目设置为在游戏开始时初始化Object数组。在切换到Board JPanel并绘制对象之前,它不会变慢。

  • 当显示Board JPanel时,对象仅被绘制一次

来自Board类的

paintComponent:

//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):

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 + "/";
}
来自Object类的

getImage():

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 :(得分:1)

从我可以告诉你的paintComponent()方法最终调用:

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

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

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

另外,在阅读图像时,您应该将图像缩放一次。