# Verständnissfragen zur Game-Loop



## Jack159 (30. Dez 2013)

Hallo,

Ich habe mir mal eine übliche Game-Loop aus einem Tutorial (Setting up the JFrame - YouTube) herausgepickt und habe dazu aber noch ein paar Verständnissfragen.
Die Fragen habe ich direkt in den Code reinkommentiert:



```
public class Game {

	public static void main(String[] args) {
		
		/*
		 * Wir wollen hier 60 Ticks pro Sekunde erreichen
		 */
		
		long lastTime = System.nanoTime();
		double nsPerTick = 1000000000D / 60D;    // speichert die Nanosekunden, die wir pro Tick im Schnitt brauchen müssen, um auf 60 Ticks pro Sekunde zu kommen
		int ticks = 0;
		int frames = 0;
		
		long lastTimer = System.currentTimeMillis();
		double delta = 0;								// soll wohl die Dauer des letzten Schleifendurchlaufes festhalten?!

		while(true) {
			long now = System.nanoTime();
			
			/*
			 *  "now - lastTime" = Dauer des letzten Schleifendurchlaufes, das ist klar.
			 *  Aber wieso wird hier nun noch durch nsPerTick geteilt? Was will man damit erreichen?
			 */
			delta += (now - lastTime) / nsPerTick;  
			
			lastTime = now;	
			boolean shouldRender = true;		// Kann man später auf false setzen um auf 60FPS zu beschränken
			
			
			/* Wann genau soll diese Schleife hier durchlaufen werden? Also wozu die Prüfung "delta >= 1" ?
			 * Ziel ist doch offenbar, dass diese Schleife 60x pro Sekunde durchlaufen wird oder? 
			 */
			while(delta >= 1) {		
				ticks++;
				tick();
				delta -= 1;			// Wieso reduziert man delta um 1? Kann man delta nicht direkt gleich 0 setzen?
				shouldRender=true;
			}
			
			try {
				Thread.sleep(2);					// Damit das System nicht voll ausgelastet wird
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			
			if(shouldRender) {
				frames++;
				render();
			}
				
			if(System.currentTimeMillis() - lastTimer >= 100) {
				lastTimer +=1000;
				System.out.println(ticks + " ticks, " + frames + "frames");
				frames = 0;
				ticks = 0;
			}
			
			
		}
		
		
	}

	private static void render() {
	}

	private static void tick() {
	}

}
```


----------



## eMmiE (31. Dez 2013)

Meiner Meinung nach soll mithilfe von delta festgestellt werde, ob die Schleife schnell genug durchlaufen wurde, sodass man auch noch das Rendern hinzunehmen kann. Wenn die Schleife zu langsam durchlaufen wurde, dann wird nicht gerendert.

Ich weiß jetzt aber noch nicht genau, was tick() machen soll. Wird da was dazu geschrieben/gesagt, bzw. was soll das eigentlich bezwecken? PC schneller machen? Einfach nur zum Überprüfen der Geschwindigkeit da?

Gruß eMmiE


----------



## Emperiz (13. Jan 2014)

Es hat sich so durchgesetzt, dass man die Game Loop (welche im Grunde das eigentliche Spiel darstellt) in die Teile "Spiellogik" und "Rendering/Grafische Darstellung" aufteilt.

Einmal pro Schleifendurchgang soll also die Spiellogik aufgerufen werden, welche dafür zuständig ist, die Daten (beispielsweise die Spielerkoordinaten) zu generieren, welche anschließend durch das Rendern grafisch dargestellt werden. Die Spiellogik kann man in einer "Obermethode" zusammenfassen, welche weitere Methoden (wo es konkret um Rechenoperationen geht) aufruft. Diese "Obermethode" wird oft *tick()* oder *update()* genannt. 

Man kann sich diese Unterscheidung auch ein bisschen wie das Model-View-Controller Design Pattern vorstellen.

Vielleicht hilft dir auch diese Tutorialreihe. Damit habe ich mir ein paar Grundlagen beigebracht.


----------

