Java - paintComponent 导致我的程序变慢
Java - paintComponent is causing my program to slow down
所以我正在开发一款由两个网格组成的游戏。每个网格都是一个 JPanel,我在其中(可能)在网格中的每个 space 上绘制一个对象。我发现 PAINTING 对象正在减慢应用程序的速度,我想知道是否有办法防止这种情况发生。
详情:
每个网格是 6x12,因此可能有 144 个对象(极端情况)加上背景会一次绘制到整个帧上。
绘制的每个对象都是一个 16x16 的图像文件,根据大小放大,不知道这是否相关,但我已经提供了对象的构造函数 class 以防它可能与初始化图像有关?
不知道如何解释这个,但是图像永远不会保存在对象中。 getImage() 函数在被另一个 class.
调用时创建并 returns 图像
目前项目设置为在游戏开始时初始化对象数组。在切换到 Board JPanel 并绘制对象之前,它不会减慢速度。
显示 Board JPanel 时对象仅绘制一次
来自板的 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 的构造函数中读取图像。然后绘画方法就可以从您的图像缓存中访问图像。
此外,读入图像时应缩放一次图像。
所以我正在开发一款由两个网格组成的游戏。每个网格都是一个 JPanel,我在其中(可能)在网格中的每个 space 上绘制一个对象。我发现 PAINTING 对象正在减慢应用程序的速度,我想知道是否有办法防止这种情况发生。
详情:
每个网格是 6x12,因此可能有 144 个对象(极端情况)加上背景会一次绘制到整个帧上。
绘制的每个对象都是一个 16x16 的图像文件,根据大小放大,不知道这是否相关,但我已经提供了对象的构造函数 class 以防它可能与初始化图像有关?
不知道如何解释这个,但是图像永远不会保存在对象中。 getImage() 函数在被另一个 class.
调用时创建并 returns 图像
目前项目设置为在游戏开始时初始化对象数组。在切换到 Board JPanel 并绘制对象之前,它不会减慢速度。
显示 Board JPanel 时对象仅绘制一次
来自板的 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 的构造函数中读取图像。然后绘画方法就可以从您的图像缓存中访问图像。
此外,读入图像时应缩放一次图像。