Swingで簡単なタワーディフェンスゲームを作成していますが、多くのスプライト(20以上)を画面に表示しようとすると、パフォーマンスの問題が発生しました。
ゲーム全体は、setIgnoreRepaint(true)を持つJPanelで行われます。次に、paintComponentメソッドを示します(conはコントローラーです)。
public void paintComponent(Graphics g){
super.paintComponent(g);
//Draw grid
g.drawImage(background, 0, 0, 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);
}
}
}
}
Targetクラスは、現在の場所にBufferedImageを単純にペイントします。getImageメソッドは、新しいBufferedImageを作成せず、Controllerクラスのインスタンスを返すだけです。
public void paintTarget(Graphics g){
g.drawImage(con.getImage("target"), getPosition().x - 20, getPosition().y - 20, null);
}
各ターゲットはスイングタイマーを実行してその位置を計算します。これは、それが呼び出すActionListenerです。
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;
}
それ以外は、repaint()は新しいタワーを配置するときにのみ呼び出されます。
どうすればパフォーマンスを向上させることができますか?