hunter19441
Grünschnabel
Hallo zusammen,
ich habe ein Ping-Pong in Java geschrieben welches auch soweit super läuft, außer das es auf meinem Laptop ruckelt und auf meinem großem Pc nicht. Ich hab bereits einen Frame-Counter eingebaut, ich begrenze die Zahl der Game-Loop Durchläufe über ein sleep(16) woraus ca. 60fps resultieren.
Auf beiden Rechnern werden mir 60fps angezeigt und es ruckelt auf meinem Laptop, die CPU Auslastung steigt bei dem Programm um ein paar Prozent an, aber keine komplette Auslastung. Ich benutze kein BufferedStrategy, oder ein selbst gebautes DoubleBuffering, nur das von JPanel integrierte DoubleBuffering ist eingeschaltet.
Code Verbesserungsvorschläge nehme ich gerne an !
Hier die Game-Loop Methode
Tech. Daten der Rechner
Laptop:
Acer
Ubuntu 64bit + Java 1.8...
4gb Ram & CPU N3540 @ 2.16GHz × 4 + integrierte Intel Graphics HD
PC:
Win 7 64bit + Java 1.8..
8gb & Amd Phenom II x4 & ATI HD 5700 series
Auf beiden Rechnern nutze ich Netbeans JDK 1.8..
So das müsste eig alles sein.
Danke für eure Hilfe.
ich habe ein Ping-Pong in Java geschrieben welches auch soweit super läuft, außer das es auf meinem Laptop ruckelt und auf meinem großem Pc nicht. Ich hab bereits einen Frame-Counter eingebaut, ich begrenze die Zahl der Game-Loop Durchläufe über ein sleep(16) woraus ca. 60fps resultieren.
Auf beiden Rechnern werden mir 60fps angezeigt und es ruckelt auf meinem Laptop, die CPU Auslastung steigt bei dem Programm um ein paar Prozent an, aber keine komplette Auslastung. Ich benutze kein BufferedStrategy, oder ein selbst gebautes DoubleBuffering, nur das von JPanel integrierte DoubleBuffering ist eingeschaltet.
Code Verbesserungsvorschläge nehme ich gerne an !

Java:
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
// Prüfen ob Objekte bereits aufgebaut
if (GerdPong.ball == null && GerdPong.player1 == null) {
return;
}
g.drawString(this.fps + " fps", 10, 20);
g.drawString(GerdPong.player1.points + " : " + GerdPong.player2.points, 475, 20);
while (!this.GameObjects.empty()) {
g2.fill((Shape) GameObjects.pop());
}
}
Hier die Game-Loop Methode
Java:
public void run() {
long last;
int width, height, x, y;
x = GerdPong.gw.getX();
y = GerdPong.gw.getY();
width = GerdPong.gw.PanelSize().width;
height = GerdPong.gw.PanelSize().height;
System.out.println(x + " " + " " + y + " " + width + " " + height);
this.doGameInit(width, height);
while (true) {
// START DER FRAME MESSUNG //
last = System.nanoTime();
// Player 1 Kollisionserkennung
// #################################################################################
if (GerdPong.player1.isCollideArc(GerdPong.ball.mPosX, GerdPong.ball.mPosY, GerdPong.ball.radius) == 5) {
if (GerdPong.ball.xDir == -1 && GerdPong.ball.yDir == -1) {
GerdPong.ball.xDir = 1;
// y = -1
} else if (GerdPong.ball.xDir == -1 && GerdPong.ball.yDir == 1) {
GerdPong.ball.xDir = 1;
// y = 1
}
}
// #################################################################################
// Player 2 Kollisionserkennung
// #################################################################################
if (GerdPong.player2.isCollideArc(GerdPong.ball.mPosX, GerdPong.ball.mPosY, GerdPong.ball.radius) == 6) {
if (GerdPong.ball.xDir == 1 && GerdPong.ball.yDir == 1) {
GerdPong.ball.xDir = -1;
// y = 1
} else if (GerdPong.ball.xDir == 1 && GerdPong.ball.yDir == -1) {
GerdPong.ball.xDir = -1;
GerdPong.ball.yDir = -1;
}
}
// #################################################################################
// Abrallen des Balls am Bildschirmrand //
GerdPong.ball.isCollideHrzScr(x, y, width, height);
/// Spieler Punktkollision + Neurstarten des Spiels (softreset) + countdown starten ///
// Linker Screen -> Player2 point++
if (GerdPong.ball.isCollideVrtScr(x, width) == 1) {
GerdPong.player2.points++;
// Spieler zurücksetzen
GerdPong.player1.resetMove();
GerdPong.player1.move();
GerdPong.player2.resetMove();
GerdPong.player2.move();
GerdPong.ball.reset();
} // Rechter Screen -> Player1 point++
else if (GerdPong.ball.isCollideVrtScr(x, width) == 2) {
GerdPong.player1.points++;
// Spieler zurücksetzen
GerdPong.player1.resetMove();
GerdPong.player1.move();
GerdPong.player2.resetMove();
GerdPong.player2.move();
GerdPong.ball.reset();
}
// Spielfeldbeschränkung der Spieler //
GerdPong.player1.isCollideScreen(y, height);
GerdPong.player2.isCollideScreen(y, height);
// Spieler bewegen und zeichnen //
GerdPong.player1.move();
GerdPong.player1.stackRect();
GerdPong.player2.move();
GerdPong.player2.stackRect();
// Ball bewegen
GerdPong.ball.move();
GerdPong.ball.stackBall();
// Alle Änderungen zeichnen
GerdPong.gw.repaint();
try {
sleep(16);
} catch (InterruptedException ex) {
Logger.getLogger(Game.class.getName()).log(Level.SEVERE, null, ex);
}
// ENDE DER FRAME MESSUNG //
fps = frames(System.nanoTime() - last);
}
}
Tech. Daten der Rechner
Laptop:
Acer
Ubuntu 64bit + Java 1.8...
4gb Ram & CPU N3540 @ 2.16GHz × 4 + integrierte Intel Graphics HD
PC:
Win 7 64bit + Java 1.8..
8gb & Amd Phenom II x4 & ATI HD 5700 series
Auf beiden Rechnern nutze ich Netbeans JDK 1.8..
So das müsste eig alles sein.
Danke für eure Hilfe.