Java - paintComponent 导致我的程序变慢



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

详情:

  • 每个网格是 6x12,因此可能会同时将 144 个对象(极端情况(加上背景绘制到整个框架上。

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

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

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

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

油漆板类中的组件:

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

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

我的代码如何为此设置有任何问题吗?还是有更有效的方法来解决这个问题?

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

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

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

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

此外,您应该在读取图像时缩放一次图像。

相关内容

  • 没有找到相关文章