繁体   English   中英

Java-paintComponent导致我的程序变慢

[英]Java - paintComponent is causing my program to slow down

因此,我正在开发一个包含两个网格的游戏。 每个网格都是一个JPanel,在其中我可以在网格的每个空间上绘制一个对象。 我发现绘画对象正在减慢应用程序的速度,我想知道是否有办法防止这种情况的发生。

细节:

  • 每个网格为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;
}

我主要担心的是,随着棋盘上的棋子变满,游戏会随着游戏的进行而开始放慢速度,这可能是未来的问题。 现在的时滞还不是很严重,但是我只能测试到目前为止只有一块木板装满后发生的情况。 我相信,随着两个委员会的填补,情况将会变得更加糟糕。

我的代码设置方式是否存在任何问题? 还是有一种更有效的方法来解决这个问题?

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

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

不要以绘画方法进行IO。 这将减慢绘画速度。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM