Verwirrender Game Loop

BrknDevee

Mitglied
Guten Abend allerseits,
ich sitze momentan an einem etwas größeren Spiel und hänge gerade am Game Loop.
Das while(true) im folgenden Code wird später selbstverständlich durch etwas angemessenes ersetzt. Mir geht es momentan darum, dass wenn ich die vergangene Zeit bei jeder Iteration ausgebe, sinnvolle Werte herauskommen, aber sobald ich die Werte jede Sekunde ausgebe, kommen sehr unterschiedliche und unsinnige Zahlen heraus. (Ausschnitt: 0, 321, 0, 320, 0, 321, 31753, 0, 0, 321, 0- normal wären bei meinem Computer Zahlen um die 2500)

Java:
public static void main(String[] args) {
       
        long lastTime = System.nanoTime();
        long time_now = 0;
        long dt = 0;
       
        long timer = System.currentTimeMillis();
       
        while(true) {
            time_now = System.nanoTime();
            dt = time_now - lastTime;
            lastTime = time_now;
           
            if(System.currentTimeMillis() >= (timer + 1000)) {
                System.out.println("dt: " + dt + "ns");
                timer = System.currentTimeMillis();
            }
        }
    }
 

krgewb

Top Contributor
Java:
public class Hauptprogramm {

    public static void main(String[] args) {

        long lastTime = System.nanoTime();
        long timer = System.currentTimeMillis();

        while (true) {

            if (System.currentTimeMillis() >= (timer + 1000)) {
                System.out.println("dt: " + (System.nanoTime() - lastTime) + "ns");
                timer = System.currentTimeMillis();
            }

            lastTime = System.nanoTime();
        }
    }

}

Ausgabe:
dt: 311127ns
dt: 692861ns
dt: 10195ns
dt: 3020ns
dt: 3398ns
dt: 10195ns
dt: 13971ns
dt: 3398ns
dt: 3399ns
dt: 3776ns
dt: 3775ns
dt: 5664ns
dt: 4531ns
dt: 7930ns
dt: 4909ns
dt: 4909ns
dt: 9062ns
dt: 12083ns
dt: 12083ns
dt: 9062ns
dt: 4531ns
 
Zuletzt bearbeitet:

krgewb

Top Contributor
Hier sind die ausgegebenen Zahlen kleiner:
Java:
public class Hauptprogramm {

    public static void main(String[] args) {

        long lastTime = System.nanoTime();
        long timer = System.nanoTime();

        while (true) {

            if (System.nanoTime() >= (timer + 1000000000)) {
                System.out.println("dt: " + (System.nanoTime() - lastTime) + "ns");
                timer = System.nanoTime();
            }

            lastTime = System.nanoTime();
        }
    }
}

Ausgabe:
dt: 121204ns
dt: 20389ns
dt: 1133ns
dt: 11327ns
dt: 1510ns
dt: 1888ns
dt: 1888ns
dt: 4153ns
dt: 106101ns
dt: 1511ns
dt: 1888ns
 
Zuletzt bearbeitet:

mrBrown

Super-Moderator
Mitarbeiter
Das while(true) im folgenden Code wird später selbstverständlich durch etwas angemessenes ersetzt. Mir geht es momentan darum, dass wenn ich die vergangene Zeit bei jeder Iteration ausgebe, sinnvolle Werte herauskommen, aber sobald ich die Werte jede Sekunde ausgebe, kommen sehr unterschiedliche und unsinnige Zahlen heraus. (Ausschnitt: 0, 321, 0, 320, 0, 321, 31753, 0, 0, 321, 0- normal wären bei meinem Computer Zahlen um die 2500)
Wie kommst du drauf, dass 2500 bei deinem Computer normal wären?

Was der Code misst ist ein Schleifendurchlauf. In den meisten Fällen ist die if-Bedingung falsch, das was Zeit braucht, ist also nur das Zeit messen und die Bedingung.

Die Zeit, die System.nanoTime(), wird unter Windows afaik alle ca. 300ns aktualisiert.
Liegen die beiden Aufrufe näher zusammen, ergibt das 0, liegen sie weiter auseinander eben die 320.
31753ns dürfte der Schleifendurchlauf mit Ausgabe der Zeit dauern, wenn die Bedingung zutrifft (uU lief in dem Moment aber auch noch was anderes, was viel Zeit brauchte)

[0, 321, 0, 320, 0, 321, 31753, 0, 0, 321, 0] ist also ziemlich genau das Erwartbare.
 

BrknDevee

Mitglied
Wie kommst du drauf, dass 2500 bei deinem Computer normal wären?
Naja, wenn ich das hier schreibe:
Java:
public static void main(String[] args) {
     
        long lastTime = System.nanoTime();
        long time_now = 0;
        long dt = 0;
     
        long timer = System.currentTimeMillis();
     
        while(true) {
            time_now = System.nanoTime();
            dt = time_now - lastTime;
            lastTime = time_now;
         
            if(System.currentTimeMillis() >= (timer + 1000)) {
                System.out.println("dt: " + dt + "ns");
                timer = System.currentTimeMillis();
            }
        }
    }
Kommen die genannten Zahlen heraus, bei
Java:
public static void main(String[] args) {
    
        long lastTime = System.nanoTime();
        long time_now = 0;
        long dt = 0;
    
        while(true) {
            time_now = System.nanoTime();
            dt = time_now - lastTime;
            lastTime = time_now;
        
            System.out.println("dt: " + dt + "ns");
        }
    }
aber kommen Zahlen um die 2500 heraus.

Was der Code misst ist ein Schleifendurchlauf. In den meisten Fällen ist die if-Bedingung falsch, das was Zeit braucht, ist also nur das Zeit messen und die Bedingung.

Die Zeit, die System.nanoTime(), wird unter Windows afaik alle ca. 300ns aktualisiert.
Liegen die beiden Aufrufe näher zusammen, ergibt das 0, liegen sie weiter auseinander eben die 320.
31753ns dürfte der Schleifendurchlauf mit Ausgabe der Zeit dauern, wenn die Bedingung zutrifft (uU lief in dem Moment aber auch noch was anderes, was viel Zeit brauchte)

[0, 321, 0, 320, 0, 321, 31753, 0, 0, 321, 0] ist also ziemlich genau das Erwartbare.
Die Erklärung ergibt aber Sinn. Wenn ich also noch rendere, etc. werden die Zahlen dann wohl sinnvoller

Vielen Dank an euch beide auf jeden Fall :)
 

mrBrown

Super-Moderator
Mitarbeiter
In deinen beiden Codes machst du unterschiedliche Dinge:
im einen jedes Mal die Dauer ausgeben und das Ausgaben damit auch mitmessen (und Ausgaben ist ziemlich langsam), im anderen nur selten die Dauer ausgeben, und damit nur die reine Zeitmessung messen, was ziemlich schnell geht.
 

krgewb

Top Contributor
Bei meinem Programmen sind die Zahlen größer, weil ich dt erst innerhalb der if-Abfrage berechne. Der Kopf der If-Abfrage verursacht Rechenaufwand.

Wenn ich also noch rendere, etc. werden die Zahlen dann wohl sinnvoller
Die Zahlen sind sinnvoll. Satt 0 ist halt in Wirklichkeit "Zwischen 0 und 300" gemeint. Es zeigt trotzdem, dass der Computer die Befehle super schnell ausführt.
Mit 321 ist in Wirklichkeit "321 +- 300" gemeint.
Mit 31753 ist in Wirklichkeit "31753 +- 300" gemeint.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Verwirrender Compiler Fehler!? Java Basics - Anfänger-Themen 3
L Wizzard-Game Java Basics - Anfänger-Themen 3
Jxhnny.lpz bouncing Ball (Brick-Breaker-Game) Java Basics - Anfänger-Themen 1
V Probleme Guessing Game Java Basics - Anfänger-Themen 8
X Game of Life Nachbarn zählen Java Basics - Anfänger-Themen 20
P Moore Nachbarschaft-Game of Life Java Basics - Anfänger-Themen 1
P 2D Game Java Basics - Anfänger-Themen 6
L Conways Game of Life Java Basics - Anfänger-Themen 4
J Game of life Java Basics - Anfänger-Themen 3
B "Snake"-Game verbuggt Java Basics - Anfänger-Themen 0
K Game of live Java Basics - Anfänger-Themen 4
F Java Collectors Game Hilfe Java Basics - Anfänger-Themen 4
C Wie kann ich jetzt von der Game.java auf die Timer.java zugreifen? Java Basics - Anfänger-Themen 6
E Belebeste Area im Game of Life suchen Java Basics - Anfänger-Themen 0
B Wer kennt einen Link für vollständiges, leichtverständliches "Game of Life"? Java Basics - Anfänger-Themen 1
F Game-Engine für textbasierendes Spiel: Architektur? Java Basics - Anfänger-Themen 9
D Textfield im Game ,Problem: while-Schleife Java Basics - Anfänger-Themen 1
C Game of life Java Basics - Anfänger-Themen 14
K Gutes Java 3D Game Tutorial gesucht Java Basics - Anfänger-Themen 6
Java-Insel Game-Konzept Java Basics - Anfänger-Themen 10
G Game Loop Problem Java Basics - Anfänger-Themen 9
T Kleines Game mit Kollision Java Basics - Anfänger-Themen 2
V Start ins Java Game Development Java Basics - Anfänger-Themen 22
I Programm Game & AR Java Basics - Anfänger-Themen 13
P Game of Life Java Basics - Anfänger-Themen 18
C Conways Game of Life / "Waldbrandsimulation": wieso temporäres Hilfs-Array?! Java Basics - Anfänger-Themen 8
K Game of Life Implementierung Java Basics - Anfänger-Themen 30
D Game of Life - Nachbarn zählen Java Basics - Anfänger-Themen 8
Developer_X Game of Life Java Basics - Anfänger-Themen 10
L Game of life in einem FensterVisualisieren Java Basics - Anfänger-Themen 2
D Game of Life Java Basics - Anfänger-Themen 14
T Anagram Game - warum ist es auf 2 Packages aufgeteilt? Java Basics - Anfänger-Themen 3
S 3d-game java3d/eigene API Java Basics - Anfänger-Themen 4
C Pong Game Java Basics - Anfänger-Themen 2
Ranger229 Endless loop in while Schleife Java Basics - Anfänger-Themen 3
P Best Practice While loop schleife Java Basics - Anfänger-Themen 5
I Scanner Loop Java Basics - Anfänger-Themen 1
J Erste Schritte Unendlichen Loop stoppen Java Basics - Anfänger-Themen 2
K loop pausieren für eine bestimmte Anzahl? Java Basics - Anfänger-Themen 1
R While-Loop der die Einträge eines Arrays in umgekehrter Reihenfolge anzeigt Java Basics - Anfänger-Themen 3
L loop für Namen Java Basics - Anfänger-Themen 11
D NullPointerException in foreach loop Java Basics - Anfänger-Themen 1
iman Loop Java Basics - Anfänger-Themen 21
CT9288 Permanent laufender loop mit Eingabefunktion gesucht Java Basics - Anfänger-Themen 1
P for-loop Java Basics - Anfänger-Themen 10
W While-Loop unterbrechen Java Basics - Anfänger-Themen 4
I TextField Array mit for Loop erzeugen Java Basics - Anfänger-Themen 4
D Was ist Loop: ? Java Basics - Anfänger-Themen 13
Zeekay Development Erste Schritte Spitzen via For-Loop Java Basics - Anfänger-Themen 4
E Wenn i (for-Loop) bestimmter Wert, dann neue Zeile eines Buttons Java Basics - Anfänger-Themen 7
K Loop ohne Schleifen Java Basics - Anfänger-Themen 2
M bufferedreader loop stoppen Java Basics - Anfänger-Themen 2
R window-Klasse, main-loop und unausschaltbares anti-aliasing Java Basics - Anfänger-Themen 0
S clip.loop(Clip.LOOP_CONTINUOUSLY); stoppen klappt nicht! Java Basics - Anfänger-Themen 11
S Warum erlaubt ein while-Loop keine Variablen-Declaration wie der for-Loop..? Java Basics - Anfänger-Themen 6
S Printstream für einen Hashmap Loop Java Basics - Anfänger-Themen 1
E Integer oder Strings spiegeln (in while loop) Java Basics - Anfänger-Themen 6
P Interpreter-Fehler Im for loop funkzioniert repaint nicht :( Java Basics - Anfänger-Themen 4
D Loop Funktion für Robot Klasse Java Basics - Anfänger-Themen 5
Devil0s while loop, Button action Java Basics - Anfänger-Themen 8
V Schon wieder ein kleines problem...dieses mal mit do-while loop Java Basics - Anfänger-Themen 9
L Mit ChangeListener JSpinner Loop erstellen Java Basics - Anfänger-Themen 2
N Problem mit Loop Java Basics - Anfänger-Themen 2
A For each loop Java Basics - Anfänger-Themen 3
A Vectors in for-loop Java Basics - Anfänger-Themen 6
S For-Each Loop Java Basics - Anfänger-Themen 16
G Loop blockt alle Events Java Basics - Anfänger-Themen 7
G Loop funktion Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben