gpt4 book ai didi

java - 绘制多个实例后,JPanel 绘制速度变慢

转载 作者:行者123 更新时间:2023-12-04 07:48:40 26 4
gpt4 key购买 nike

我正在构建一个游戏,我正在使用 JPanel 的绘图功能绘制道路 Sprite 。可以通过拖动鼠标来 build 道路(建筑类),并且在每个字段上都会出现一个新的道路 Sprite 。但是在我绘制了 20 个道路 Sprite 之后,绘制变得非常缓慢。
我有一个框架,上面有这个 JPanel。
这是我的游戏绘图所在的 JPanel 的代码:

private class GamePanel extends JPanel implements ActionListener{

Field[][] map = gameEngine.getMap().getFields();
ArrayList<Building> buildings = gameEngine.getBuildings();
Timer timer;
ArrayList<Field> fields = new ArrayList<>();
GameFrame frame; //REFERENCE FOR THE CONTAINER OF THIS PANEL

private int mousePosX;
private int mousePosY;

GamePanel(GameFrame frame){
/*...*/
Mouse mouseListener = new Mouse();
addMouseListener(mouseListener);
addMouseMotionListener(mouseListener);

timer = new Timer(1000/30,this);
timer.start();
/*...*/
}

public void paintComponent(Graphics g) {
super.paintComponent(g);
draw(g);
}

public void draw(Graphics g){
for(Building b : buildings){
int drawPosX = b.getLocation().getPos().x*40;
int drawPosY = b.getLocation().getPos().y*40;

try {
BufferedImage img = ImageIO.read(new File("src/GFX/" + b.getType() + ".png"));
g.drawImage(img, drawPosX, drawPosY, null);
} catch (IOException e) {
}
}
}

@Override
public void actionPerformed(ActionEvent e) {
// I thought this is not needed because I call "repaint()" only at mouse events (like
// building road by dragging)
}

public class Mouse extends MouseAdapter{
@Override
public void mouseDragged(MouseEvent evt){

repaint(); // THIS IS AN EXAMPLE TO WHERE I CALL THE REPAINT()

fieldPosX = evt.getX() - (evt.getX() % 40);
fieldPosY = evt.getY() - (evt.getY() % 40);

gameEngine.placeRoad(new SimpleRoad(new Field(fieldPosX/40,fieldPosY/40)));
}

/*... OTHER MOUSE EVENTS ...*/
}


我认为仅在鼠标事件时调用 repaint() 会优化速度,但事实并非如此。我附上了一个 GIF,可以看到在 2 行道路之后,它变得非常慢。
GIF of me building a lot of roads
我听说过 invokeLater 并且人们建议我使用它,但我不知道如何在这个项目中实现它。为什么我的游戏在几个建筑物后变慢了,我哪里出错了? invokeLater 会解决问题吗?我如何将它放在我的项目中?
感谢您的帮助!

最佳答案

Why is my game getting slower after several buildings,

try
{
BufferedImage img = ImageIO.read(new File("src/GFX/" + b.getType() + ".png"));
g.drawImage(img, drawPosX, drawPosY, null);
}
不要在绘制方法中进行 I/O。随着您添加更多建筑物,您正在执行更多 I/O。
图像应该在类的构造函数中读取。
您可以将它们保存在 HashMap 中,以便在绘制方法中轻松访问。
或者,图像可以保存为 Building 类本身的一部分。

关于java - 绘制多个实例后,JPanel 绘制速度变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67078049/

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