Hallo Zusammen,
habe dieses Forum erst gestern im Netz entdeckt und bin guter Dinge hier in Zukunft einen Teil meiner Freizeit zu verbringen.
Ich programmiere derzeit einen Arkanoid-Klon und habe mich dafür entschieden, die Berechnung der Physik und das Zeichnen der Ausgabe (OpenGL /JOGL) auf zwei Threads aufzuteilen.
Beide Threads greifen auf eine Singleton-Klasse "GameWorld" zu, in der sich unter anderem zwei von LinkedList abgeleitete Listen für die Verwaltung der Partikeleffekte und der "Spielsteine" befindet.
Die Physikberechnung und die OGL-Ausgabe sind jeweils Methoden dieser zwei Klassen/Listen und werden von den Threads aufgerufen - das Rendern über den Standard-JOGL-Thread (meine Hauptklasse), die Physikberechnungen über einen eigenen Thread, der mit wait() periodisch durchlaufen wird.
Das Problem
Das Problem habt ihr wahrscheinlich schon erkannt. Durchläufe der Listen geschehen oft gleichzeitig, weil beide Methoden der Listen-klassen parallel aufgerufen werden. Das äußert sich auf auf meinen zwei Rechnern unterschiedlich stark z.B. durch falsches Entfernen von Steinen / Einfärben getroffener Steine.
Abhilfe sollte da wohl das Monitor-Konzept (synchronized) von Java schaffen. Allerdings habe ich Schwierigkeiten, dieses korrekt auf mein Problem anzuwenden, weil ich den Zugriff auf die Objekte innerhalb der for-Schleifen an mehreren Stellen nicht zentral in eine synchronized Methode packen kann.
Soweit zumindest mein Verständnis des Problems.
Habe ich evtl. einen Fehler im Konzept oder nur keinen Peil, wie ich es richtig anstellen muss?
Könnt ihr mir an diesem Punkt weiterhelfen?
Heute Nachmittag könnte ich auch meinen Code entsprechend aufbereiten und hier posten, falls das Problem noch nicht verständlich ist.
Viele Grüße,
Christian
Hier noch zwei Beispiele wie die Liste in den beiden nebenläufigen Methoden durchlaufen wird:
habe dieses Forum erst gestern im Netz entdeckt und bin guter Dinge hier in Zukunft einen Teil meiner Freizeit zu verbringen.
Ich programmiere derzeit einen Arkanoid-Klon und habe mich dafür entschieden, die Berechnung der Physik und das Zeichnen der Ausgabe (OpenGL /JOGL) auf zwei Threads aufzuteilen.
Beide Threads greifen auf eine Singleton-Klasse "GameWorld" zu, in der sich unter anderem zwei von LinkedList abgeleitete Listen für die Verwaltung der Partikeleffekte und der "Spielsteine" befindet.
Die Physikberechnung und die OGL-Ausgabe sind jeweils Methoden dieser zwei Klassen/Listen und werden von den Threads aufgerufen - das Rendern über den Standard-JOGL-Thread (meine Hauptklasse), die Physikberechnungen über einen eigenen Thread, der mit wait() periodisch durchlaufen wird.
Das Problem
Das Problem habt ihr wahrscheinlich schon erkannt. Durchläufe der Listen geschehen oft gleichzeitig, weil beide Methoden der Listen-klassen parallel aufgerufen werden. Das äußert sich auf auf meinen zwei Rechnern unterschiedlich stark z.B. durch falsches Entfernen von Steinen / Einfärben getroffener Steine.
Abhilfe sollte da wohl das Monitor-Konzept (synchronized) von Java schaffen. Allerdings habe ich Schwierigkeiten, dieses korrekt auf mein Problem anzuwenden, weil ich den Zugriff auf die Objekte innerhalb der for-Schleifen an mehreren Stellen nicht zentral in eine synchronized Methode packen kann.
Soweit zumindest mein Verständnis des Problems.
Habe ich evtl. einen Fehler im Konzept oder nur keinen Peil, wie ich es richtig anstellen muss?
Könnt ihr mir an diesem Punkt weiterhelfen?
Heute Nachmittag könnte ich auch meinen Code entsprechend aufbereiten und hier posten, falls das Problem noch nicht verständlich ist.
Viele Grüße,
Christian
Hier noch zwei Beispiele wie die Liste in den beiden nebenläufigen Methoden durchlaufen wird:
Code:
public void draw(GL gl) {
for (int i = 0; i <= super.size()-1; i++) {
Particle par = (Particle)super.get(i);
par.draw(gl);
}
}
public void process() {
for (int i = 0; i <= super.size()-1; i++) {
Particle par = (Particle)super.get(i);
//Berechne Position etc. des Partikels
// ...
}
}