所以我正在开发一个由两个网格组成的游戏。每个网格都是一个JPanel,我在网格中的每个空间上绘制一个对象(可能)。我发现 PAINTING 对象正在减慢应用程序的速度,我想知道是否有办法防止这种情况发生。
详细信息:
每个网格为6x12,因此可能会有144个对象(极端情况)加上背景一次性涂在整个框架上。
绘制的每个对象都是一个16x16图像文件,根据大小放大,不知道这是否相关,但我提供了对象类的构造函数,以防万一可能与初始化图像有关吗?
不知道如何解释这个,但Image永远不会保存在对象中。 getImage()函数在被另一个类调用时创建并返回Image。
目前,项目设置为在游戏开始时初始化Object数组。在切换到Board JPanel并绘制对象之前,它不会变慢。
当显示Board JPanel时,对象仅被绘制一次
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;
}
我主要担心的是,随着电路板的填满,游戏开始变慢,这可能是未来的问题。现在,滞后并不是很糟糕,但我只能测试到目前为止只有一块电路板被填满时会发生什么。我相信随着两块板的填充,它会变得更糟。
我的代码是如何设置的?或者有更有效的方法来解决这个问题吗?
答案 0 :(得分:1)
从我可以告诉你的paintComponent()方法最终调用:
BufferedImage img = ImageIO.read(this.getClass().getResource(imgPath + current + ".png"));
不要在绘画方法中做IO。这会减慢画面的速度。
应该在班级的构造函数中读取图像。然后绘画方法可以只从您的图像缓存访问图像。
另外,在阅读图像时,您应该将图像缩放一次。