[英]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.