gpt4 book ai didi

Java - PaintComponent 导致我的程序变慢

转载 作者:行者123 更新时间:2023-12-02 11:18:19 24 4
gpt4 key购买 nike

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

详细信息:

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

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

  • 不知道如何解释这个问题,但图像从未保存在对象中。 getImage() 函数在被另一个类调用时创建并返回图像。

  • 当前项目设置为在游戏开始时初始化对象数组。在切换到 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;
}

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

我的代码为此设置是否有任何问题?或者有更有效的方法来处理这个问题吗?

最佳答案

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

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

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

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

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

关于Java - PaintComponent 导致我的程序变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50111212/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com