Java Swing Games perform poorly when many sprites are on the screen

I'm making a simple tower defense game in swing. When I try to place many elves (more than 20) on the screen, I encounter a performance problem

The whole game takes place on a JPanel with setignorerepair (true) This is the paintcomponent method (con is the controller):

public void paintComponent(Graphics g){
    super.paintComponent(g);
    //Draw grid
    g.drawImage(background,null);
    if (con != null){
        //Draw towers
        for (Tower t : con.getTowerList()){
            t.paintTower(g);
        }
        //Draw targets
        if (con.getTargets().size() != 0){
            for (Target t : con.getTargets()){
                t.paintTarget(g);
            }
            //Draw shots
            for (Shot s : con.getShots()){
                s.paintShot(g);
            }
        }
    }
}

The target class simple draws bufferedimage at its current position The getimage method does not create a new bufferedimage, but only returns an instance of the controller class:

public void paintTarget(Graphics g){
    g.drawImage(con.getImage("target"),getPosition().x - 20,getPosition().y - 20,null);
}

Each target runs a swing timer to calculate its position This is the actionlistener it calls:

public void actionPerformed(ActionEvent e) {
    if (!waypointReached()){
        x += dx;
        y += dy;
        con.repaintArea((int)x - 25,(int)y - 25,50,50);
    }
    else{
        moving = false;
        mover.stop();
    }
}

private boolean waypointReached(){
    return Math.abs(x - currentWaypoint.x) <= speed && Math.abs(y - currentWaypoint.y) <= speed;
}

In addition, repaint() is called only when a new tower is placed

How to improve performance?

Solution

This may be your problem – let each target / bullet (I assume?) Being responsible for tracking when to update yourself and drawing yourself sounds like a lot of work A more common method is to cycle along the line

while (gameIsRunning) {
  int timeElapsed = timeSinceLastUpdate();
  for (GameEntity e : entities) {
    e.update(timeElapsed);
  }
  render(); // or simply repaint in your case,I guess
  Thread.sleep(???); // You don't want to do this on the main Swing (EDT) thread though
}

Essentially, an object in the chain is responsible for tracking all entities in the game and telling them to update and render them

The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
分享
二维码
< <上一篇
下一篇>>