Frage zu Threads

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:
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();
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:
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?
 
S

SlaterB

Gast
was ist denn 'der ursprüngliche Thread'? den kennt nicht jeder so auf Anhieb,

klar ist dass irgendwer den Konstruktor von Canvas aufruft, irgendein Thread muss schon da sein,
anfangs z.B. der main-Thread der die main-Methode ausführt oder auch ein GameLoop-Thread wie du im weiteren andeutest,

diese könnten auch die Aufgaben vom GameCanvas-Thread übernehmen, stimmt,
wenn der ursprüngliche Thread nichts mehr zu tun hat, könnte der direkt run() von GameCanvas aufrufen,
es würde kein zweiter Thread benötigt, das ginge problemlos

falls es sich um den GameLoop-Thread handeln, so erstellt der vielleicht anfangs die GUI
und kommt dann zu der MAX_GAME_SPEED-Schleife, für diesen beschäftigten Thread wäre es ungünstig,
die GameCanvas-Aufgaben auch zu übernehmen

edit:
ach, GameLoop ist bei dir der zweite Thread? dann ist wieder eher unklar wer der erste ist, für main habe ich die Möglichkeiten angedeutet,
aber wie wäre es etwa, wenn GameCanvas über einen Button erzeugt wird, vom AWT-Thread aus, der die GUI blockiert,
der dürfte damit nicht belastet werden,

oder es soll möglich sein, zwei Spiele parallel laufen zu lassen,
hat schon seine Vorteile wenn Dinge autark laufen, egal wer sie aufruft und egal welche Threads sonstwo laufen,
ist nicht schlimm wenn ein Thread beendet und dafür ein andere gestartet wird, auch wenn man es in bestimmten Konstellationen vermeiden könnte



------

die Schleife sieht brauchbar aus, das paint() wird entweder aufgrund des yields()
vor Zeile 10 ausgeführt, dann musst nur wenig geschlafen werden,

ansonsten ist das sleep() über eine längere Zeit und währenddessen ist dann Zeit fürs paint()

grundsätzlich mag das also funktionieren, muss auch nicht exakt sein,
wenn mal ein FPS ausfällt, ist das kein Beinbruch

für richtig hochwertige Anzeigen würde man sich eher nicht auf indirektes unkontrollieres repaint()/paint() einlassen,
im einfachen Falle kommt das aber ausreichend hin
 
Zuletzt bearbeitet von einem Moderator:

Quaxli

Top Contributor
Der erste Thread ist der Event Dispatching Thread. Irgendwer muß ja weiterhin permanent Eingaben von Tastatur und Maus entgegen nehmen. :)
 
Hi,
schonmal danke für eure Antworten.
Also mit ursprünglichen Thread hatte ich den main Thread gemeint. In meiner Canvas Klasse gibts dann eine main Methode die das Objekt erzeugt, also so:

Java:
public static void main(String[] args) {
        new GameCanvas();
    }

Ich erzeuge insgesamt nur den einen Thread im Konstruktor.
Also theoretisch hat der main Thread nach dem Konstruktor nichts mehr zu tun, oder muss der Konstruktor bis zur geschlossenen Klammer durchlaufen werden? Ohne Thread würde dann ja der Konstruktor nie beendet werden.

Das mit den Maus/Tastatureingaben hab ich mir auch schon gedacht. Wäre das dann sozusagen der Thread für den Listener? Habe bis jetzt allerdings immer gedacht, dass für einen Maus/Key -Listener automatisch ein neuer Thread erstellt wird.
 
S

SlaterB

Gast
> dass für einen Maus/Key -Listener automatisch ein neuer Thread erstellt wird.

nein

-----

der GameCanvas-Konstruktor würde nicht beendet werden, wenn man im Konstruktor die run-Methode mit der Endlosschleife aufruft,
ich habe da noch keinen richtigen Nachteil zu gesehen, wenn aber der main-Thread die Aufgabe übernehmen soll, dann sicherlich lieber

Java:
public static void main(String[] args) {
       GameCanvas g = new GameCanvas();
       g.run();
    }

ansonsten vom GameCanvas-Konstruktor aus einen neuen Thread starten, dann wird der Konstruktor auch beeendet,
der main-Thread hat danach nichts mehr zu tun, verläßt die main-Methode und wird bald beendet

soweit geklärt oder was genau war die Frage?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Minecraft Frage für einen Minecraft Server Spiele- und Multimedia-Programmierung 2
G [Java/KryoNet/LibGDX] Mutliplayer Packet Frage Spiele- und Multimedia-Programmierung 2
G [Java Server] Allgemeine Frage zum Thema Networking in Videospielen Spiele- und Multimedia-Programmierung 15
J Frage zum Einlesen einer .wav in ein byte Array Spiele- und Multimedia-Programmierung 3
S ImageSlider frage Spiele- und Multimedia-Programmierung 3
Anfänger2011 Minimap: Theoretische Frage zur Umsetzung Spiele- und Multimedia-Programmierung 2
Androbin Kollisions-Frage Spiele- und Multimedia-Programmierung 8
windl Frage zu Airplay und zur Mitarbeit bei einer Mediaanlage Spiele- und Multimedia-Programmierung 0
S LWJGL Kamera Frage Spiele- und Multimedia-Programmierung 2
P Frage zu einem Projekt "Einarmiger Bandit" 3 Walzen / 9 Zeichnungen BLUEJ Spiele- und Multimedia-Programmierung 10
Guybrush Threepwood Ketzerische Frage: Opus-Codec für Java Spiele- und Multimedia-Programmierung 14
CookieSoft OpenGl Translatef Frage Spiele- und Multimedia-Programmierung 2
Kenan89 Theoretische Frage zu Tile Spielkarten Spiele- und Multimedia-Programmierung 9
R Tileloader Frage Spiele- und Multimedia-Programmierung 2
S Frage: NullPointer, aber warum? Spiele- und Multimedia-Programmierung 8
J Anfänger Frage wie adden? Spiele- und Multimedia-Programmierung 9
R Frage zur Kollision Spiele- und Multimedia-Programmierung 5
M.F.G. Spielvorstellung (plus KI frage): Connect Four – Extreme Spiele- und Multimedia-Programmierung 11
Helgon OpenGL Blend Frage Spiele- und Multimedia-Programmierung 18
P Frage bzgl. TextAdventure Spiele- und Multimedia-Programmierung 11
K Frage zur 3D Entwicklung zwecks vorhandener Engines Spiele- und Multimedia-Programmierung 17
V Frage zu AffineTransforms Spiele- und Multimedia-Programmierung 2
N frage zu der mp3spi Spiele- und Multimedia-Programmierung 2
C Frage zu Ray-Picking mit JOGL Spiele- und Multimedia-Programmierung 13
M VRML Loader(noob Frage) ^^ Spiele- und Multimedia-Programmierung 3
M Prinzipielle Frage: Kann Java Grafiken ausschneiden? Spiele- und Multimedia-Programmierung 3
R Frage zu Hütchenspielprogrammierung! Spiele- und Multimedia-Programmierung 47
V Frage zu Grafiken und Software! Spiele- und Multimedia-Programmierung 5
radiac Mal eine ganz Doofe Frage... verzeiht :) Spiele- und Multimedia-Programmierung 9
Developer_X Eine Frage zur ViewBesetzung Spiele- und Multimedia-Programmierung 28
H BlueJ Frage Spiele- und Multimedia-Programmierung 13
K Malefiz programmieren - Frage zu den einzelnen Spielfeldern Spiele- und Multimedia-Programmierung 5
G Ping Pong Frage Spiele- und Multimedia-Programmierung 17
0x7F800000 allgemeine frage zu Java 3D Spiele- und Multimedia-Programmierung 12
B Frage zur Spielsteuerung bei einem rundenbasiertes Spiel Spiele- und Multimedia-Programmierung 5
G frage zu tutorial Spiele- und Multimedia-Programmierung 3
M Frage eines Anfängers Spiele- und Multimedia-Programmierung 3
N Schiffe Versenken Frage zum Spielbrett Spiele- und Multimedia-Programmierung 24
N Generelle Frage: "GUI"-Werkzeuge Spiele- und Multimedia-Programmierung 5
X Frage zu Import von CAD Zeichnungen Spiele- und Multimedia-Programmierung 4
A kurze Frage zu Java3D! (automatische Skalierung) Spiele- und Multimedia-Programmierung 3
S Poker - grundlegende frage zu paint() Spiele- und Multimedia-Programmierung 10
B Frage zum GUI-Design bei Brettspielen Spiele- und Multimedia-Programmierung 4
P Frage zum Scrolling Spiele- und Multimedia-Programmierung 23
B Frage zum Abspielen von Sounddateien Spiele- und Multimedia-Programmierung 2
J Frage zu Geometry und Shape3D Spiele- und Multimedia-Programmierung 4
J Frage zu Transform3D.mul() Spiele- und Multimedia-Programmierung 2
J Java3D: Texture-Frage Spiele- und Multimedia-Programmierung 4
C frage zu glrotated Spiele- und Multimedia-Programmierung 12
T Einsatzbereich-Frage von Java 3D Spiele- und Multimedia-Programmierung 24
S [Java2D] Performance Frage Spiele- und Multimedia-Programmierung 4
G Frage zur Sichtbarkeit von Flächen Spiele- und Multimedia-Programmierung 2
S ständig neue Threads Spiele- und Multimedia-Programmierung 4
E Zwei Threads miteinander laufen lassen Spiele- und Multimedia-Programmierung 6
Z Objekte animieren mit Threads Spiele- und Multimedia-Programmierung 4
M Minecraft Minecraft, MySQL und Threads Spiele- und Multimedia-Programmierung 12
J Problem mit Threads Spiele- und Multimedia-Programmierung 8
F Java zwei gleiche Threads mit unterschiedlichen Parametern Spiele- und Multimedia-Programmierung 2
L Synchronisierung von Threads die Antwort? Spiele- und Multimedia-Programmierung 8
I Problem mit Threads Spiele- und Multimedia-Programmierung 25
L Threads: Denkzeit-Timer Spiele- und Multimedia-Programmierung 3
Tapsi Thread wartet auf Threads Spiele- und Multimedia-Programmierung 7
hdi mehrere Threads/Tasks in einem synchronisieren -> TaskPoo Spiele- und Multimedia-Programmierung 36
0 Problem mit zeitsynchroner Hauptschleife/Threads Spiele- und Multimedia-Programmierung 28
D threads in j3d? Spiele- und Multimedia-Programmierung 6

Ähnliche Java Themen

Neue Themen


Oben