Hallo,
eigetnlich verstehe ich das Prinzip von Thread schon einigermaßen, allerdings ist mir bei Spieletutorials öfter eine bestimmte Vorgehensweise aufgefallen die ich noch nicht ganz nachvollziehen kann.
Ich erkär kurz mal den Grundaufbau, also:
Man erstellt eine Klasse und leitet diese von Canvas/JPanel ab. Im Konstruktor werden dann verschiedene Einstellungen wie zb. Größe,Position,ein Frame für aussenrum... erstellt. Zum schluss wird dann immer ein neuer Thread erzeugt und auch gleich gestartet.
Sieht dann so ungefähr aus:
In der run()-Mehtode läuft jetzt der sog. GameLoop. Was sich mir jetzt nicht ganz erschließt: Welche aufgabe übernimmt nun welcher Thread? Es gibt ja den ursprünglichen Thread und den neu erstellten.
So wie ich das verstanden habe, läuft jetzt die run-Methode "parallel" zum ursprünglichen Thread. Die Befehle in der run-Methode werden aber immer noch sequentiell abgearbeitet (ausser vielleicht bei dem repaint() Aufruf). Das ganze Spiele läuft doch aber im GameLoop ab, wo bleibt dann der andere Thread? Ich würds ja noch verstehen wenn nach dem aufruft
weitere Methodenaufrufe kommen würden. Dann würde nämlich die run Methode schonmal laufen und die Befehle danach trotzdem "gleichzeitig" ausgeführt werden.
Gleich noch ne Frage zur Berechnung der FPS: Die Zeichenoperationen laufen alle in paint ab. Paint wird ja durch repaint() im GameLoop aufgerufen. Allerdings passiert das ja nicht sofort. Es wird sozusagen nur der Aufruf von paint angefordert. Hab mir mal per System.out.print testweise was ausgeben lassen, und da sieht man auch das der GameLoop schon mehrmals durchlaufen wurde bis es überhaupt zum Aufruf von paint kommt. Allerdings setzten doch die Berechnungen der fps gerade voraus, dass die Zeichenoperationen ausgeführ werden. Hier mal der Code:
Ist das so überhaupt sinnvoll?
eigetnlich verstehe ich das Prinzip von Thread schon einigermaßen, allerdings ist mir bei Spieletutorials öfter eine bestimmte Vorgehensweise aufgefallen die ich noch nicht ganz nachvollziehen kann.
Ich erkär kurz mal den Grundaufbau, also:
Man erstellt eine Klasse und leitet diese von Canvas/JPanel ab. Im Konstruktor werden dann verschiedene Einstellungen wie zb. Größe,Position,ein Frame für aussenrum... erstellt. Zum schluss wird dann immer ein neuer Thread erzeugt und auch gleich gestartet.
Sieht dann so ungefähr aus:
Java:
public class GameCanvas extends Canvas implements Runnable {
public GameCanvas() {
Frame f = new Frame();
f.setSize(..);
f.add(this);
.........
new Thread(this).start();
}
}
In der run()-Mehtode läuft jetzt der sog. GameLoop. Was sich mir jetzt nicht ganz erschließt: Welche aufgabe übernimmt nun welcher Thread? Es gibt ja den ursprünglichen Thread und den neu erstellten.
So wie ich das verstanden habe, läuft jetzt die run-Methode "parallel" zum ursprünglichen Thread. Die Befehle in der run-Methode werden aber immer noch sequentiell abgearbeitet (ausser vielleicht bei dem repaint() Aufruf). Das ganze Spiele läuft doch aber im GameLoop ab, wo bleibt dann der andere Thread? Ich würds ja noch verstehen wenn nach dem aufruft
Java:
new Thread(this).start();
Gleich noch ne Frage zur Berechnung der FPS: Die Zeichenoperationen laufen alle in paint ab. Paint wird ja durch repaint() im GameLoop aufgerufen. Allerdings passiert das ja nicht sofort. Es wird sozusagen nur der Aufruf von paint angefordert. Hab mir mal per System.out.print testweise was ausgeben lassen, und da sieht man auch das der GameLoop schon mehrmals durchlaufen wurde bis es überhaupt zum Aufruf von paint kommt. Allerdings setzten doch die Berechnungen der fps gerade voraus, dass die Zeichenoperationen ausgeführ werden. Hier mal der Code:
Java:
while(!exit) {
try {
long startTime = System.currentTimeMillis();
repaint();
Thread.yield();
long executionTime = System.currentTimeMillis() - startTime;
if (executionTime < MAX_GAME_SPEED) {
Thread.sleep(MAX_GAME_SPEED - executionTime);
}
} catch (Exception e) {}
}
Ist das so überhaupt sinnvoll?