我正在制作一个小型的2D平台游戏。我注意到游戏滞后了很多。使用NetBeans分析模式时,问题似乎在我的gameLoop计时器内部和重绘部分。我正在使用java.util.Timer和TimerTask作为我的gameLoop计时器。它每11ms运行一次。
我找到了一个帮助一些的小修复程序,每2/3循环只调用重绘一次。我怀疑这不是最好的解决办法,因为它只会有所帮助。这里有没有人知道如何做更好的优化?
面板代码:
package main;
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;
public class Panel extends javax.swing.JPanel {
//Klassen som lysnar efter keylisteners
private KeyList listener;
//Skapandet av spelare och object
public Spelare p;
public ArrayList<Vägg> väggar;
int gravatyTimer = 0;
int repaintTimer = 0;
int gravSpeed;
public Panel() {
initComponents();
gameLoop.schedule(loop, 11, 11);
p = new Spelare(20, 100, 50);
väggar = new ArrayList<>();
skapaVäggar();
//Gör det möjligt för programet att lyssna efter keypresses
listener = new KeyList();
this.setFocusable(true);
this.requestFocus();
this.addKeyListener(listener);
gravSpeed = p.getGravSpeed();
}
public void skapaVäggar() {
for (int i = 0; i < 550; i += 50) {
Vägg info = new Vägg(i, 400, 50);
väggar.add(info);
}
Vägg info = new Vägg(550,350,50);
väggar.add(info);
Vägg ingo = new Vägg(150,200,50);
väggar.add(ingo);
Vägg b = new Vägg(250,240,50);
väggar.add(b);
Vägg a = new Vägg(400,290,50);
väggar.add(a);
}
//Lyssnar efter keypresses och gör saker
private class KeyList extends KeyAdapter {
@Override
public void keyTyped(KeyEvent e) {
//Inget
}
@Override
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
int moveSpeed = p.getWalkSpeed();
//Höger
if (key == 39) {
p.setHsp( moveSpeed );
}
//Vänster
if (key == 37) {
p.setHsp( -moveSpeed );
}
//Hoppa
if ( key == 32 && p.placeMeetingPreciseY(p.getY(), väggar) ) {
p.hoppa();
}
}
@Override
public void keyReleased(KeyEvent e) {
int key = e.getKeyCode();
//Höger
if (key == 39) {
p.setHsp(0);
}
//Vänster
if (key == 37) {
p.setHsp(0);
}
}
}
//Main game loop
Timer gameLoop = new Timer();
TimerTask loop = new TimerTask() {
public void run() {
//Egentliga loop
//Lägger till gravitation
if (gravatyTimer <= 0) {
p.addVsp( gravSpeed );
gravatyTimer = 8;
} else {
gravatyTimer--;
}
//Kollar kollision
kollaKollision();
//Flyttar spelare
p.flyttaXLed();
p.flyttaYLed();
if (repaintTimer <= 0) {
repaint();
repaintTimer = 2;
} else if (repaintTimer == 1) {
repaint();
} else {
repaintTimer--;
}
}
};
public void kollaKollision() {
//Kollar vertikal kollision
if ( p.placeMeetingY(p.getY()+p.getVsp(), väggar) ) {
p.setVsp(0);
}
//Kollar horisontel kollision
if ( p.placeMeetingX(p.getX()+p.getHsp(), väggar) ) {
p.setHsp(0);
}
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
p.rita(g);
for (int i = 0; i < väggar.size(); i++) {
väggar.get(i).rita(g);
}
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 400, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 300, Short.MAX_VALUE)
);
}// </editor-fold>
// Variables declaration - do not modify
// End of variables declaration
}