Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

03.11.2010, 13:31

[Java] Fragen zu Swing und Threads

Moinsen alle miteinander.
Ich habe mit Java angefangen und programmiere gerade eine kleine 2dEngine, welche ich Später für Jump&Runs nutzen möchte.

Dafür nutze ich Javax.Swing (JFrame/JPanel&Co).

Soweit ich weiß laufen Swing komponenten in einem eigenen Thread, wobei Swing nicht Threadsicher ist.
Mein anfänglicher aufbau sieht wie folgt aus:

Gameengine(Abgeleitet von JFrame, hier findet die gesamte Programmlogik statt, außer das Rendern)
Screen(Abgeleitet von JPanel, führt NUR die renderoperationen aus, keine schreiboperationen in die variablen andere komponenten, oder welche durch andere komponenten verändert werden könnten, ist ChildObject der Gameengine)

Die main funktion erstellt ein Gameengine objekt, und alles weitere läuft dann im Gameengine objekt ab.
Daraufhin erstellt das Gameengine object ein Screenobject, und übergibt beim konstruktor einen verweis auf die Mapdaten.
Als letztes wird ein timer erstellt, der 60mal pro sekunde die Gameengine Logik ausführt, ist der Logikteil fertig, ruft er repaint() auf, womit automatisch das paint event aller screens ausgelößt wird.(hier könnt ich vielleicht noch ein automatisches repaint der komponenten verhindern. Wen zb ein teil des fensters verdeckt war und wieder sichtbar wird, wird von java nunmal ebenfalls repaint getriggert)

Die screens LESEN jetzt die mapdaten und zeichnen den benötigten inhalt auf sich selbst, keine anderweitigen schreiboperationen die etwas außerhalb des Screenobjetcs beeinflussen.


Folgende Fragen stellen sich mir:
-Laufen alle Swing objekte in EINEM neuen Thread, oder hat jedes Swing objekt seinen eigenen Thread
-Wenn alle möglichen schreiboperationen vom Gameengine objekt ausgehen, und die Screens lediglich Lesemöglichkeiten haben, wie sieht es da mit der Threadsicherheit aus? (ich weiß, das bei 2 zeitgleichen schreiboperationen in der selben Adresse das ganze zusammen klappt, aber wie verhält es sich hierbei?)

Wenn noch etwas unverständlich ist, bitte nachfragen, ich neige oft zu konfusen erklärungen^^"

MFG
Memnarch
Meine Website mit Updates/News zu Aktuellen Projekten:SpareTime-Development

Tobiking

1x Rätselkönig

  • Private Nachricht senden

2

05.11.2010, 02:10

Soweit ich weiß erzeugt Swing nur einen Thread, und zwar den Event Dispatcher Thread. Dieser hat eine Warteschlange mit allen Events und ruft entsprechend die passenden Listener- und Paintfunktionen der Komponenten auf. Wenn es nun heißt Swing ist nicht threadsicher, ist damit gemeint das gewisse Änderungen an der GUI außerhalb des Event Dispatchers für Probleme sorgen können. Ich könnte mir da den Fall vorstellen wenn man von Außen eine Komponente der GUI entfernt, während der Event Dispatcher über den GUI Baum läuft. Das ist aber meistens nicht das Problem, da wie gesagt eh alle Listener und Paint Funktionen schon vom Event Dispatcher aufgerufen werden. Auch das Aufrufen von Repaint auf eine Komponente ist problemlos, da dies nur ein neues Event erzeugt, das in die Warteschlange eingereiht wird. Falls man dennoch etwas anderes von Außen machen will gibt es InvokeAndWait bzw. InvokeLater, mit dem man ein Runnable Objekt in die Warteschlange einreihen kann, das dann im Event Dispatcher Thread ausgeführt wird.

Dein Timer der 60 mal die Sekunde die Logik macht ist aber auch ein eigener Thread. Es kann also durchaus vorkommen das während der Ausführung der Logik gerade ein Repaint oder ein Listener für Eingaben etc. ausgeführt wird und ebenfalls auf die Daten zugreifen will. Dein Problem dürfte hier sein das während des Logik durchlaufs nicht unbedingt ein konsistenter Zustand vorliegen muss. Zum Beispiel könnte erst die halbe Karte geupdatet sein wenn die Daten zum Zeichnen geholt werden. Das könnte zu komischen Ergebnissen führen. Man könnte natürlich während des Logik Updates den Zugriff auf die Daten sperren bzw. gegenseitigen Ausschluss einbauen, nur macht man sich damit wahscheinlich neue Probleme, da man nicht so genau kontrolleren kann wie sich beide Threads abwechseln. Daher wäre eine Lösung mit einem einzelnen Thread, die einem normalen gameloop entspricht sicherlich zu bevorzugen.

3

05.11.2010, 14:24

Tobiking hat ja eigentlich schon alles gesagt.
Hier mal ein ganz nettes Template für Java Spiele (ist allerdings für Java 4K Spiele gedacht) http://www.ahristov.com/taller/procgraph…teComplete.java
Das Doublebuffering da drin sollte für dich am interessantesten sein - siehe java.awt.image.BufferStrategy. Die Gameloop könnte auch was für dich sein...

Werbeanzeige