Hi,
ich arbeite zurzeit an einer relativen einfachen Engine. Diese sollte am Ende je einen eigenen Thread für das Rendern und die Logik besitzen.
Auch wenn es noch etwas dauert bis ich tatsächlich das ganze in 2 Threads aufsplitten werde, würde ich gerne jetzt schon das Grundkonzept haben, damit ich meinen COde schon entsprechend schreiben kann.
Mein größtes Problem dabei ist, die Kommunikation der Threads, ich habe schon ein paar Versuche gemacht und etwas herumgesucht, deshalb stelle ich hier mal vor was ich soweit habe, und wo meiner Meinung nach mögliche Probleme liegen könnten. Es würde mich freuen, wenn diejenigen die etwas erfahrung mit Multithreading haben mir dann ein paar Tips oder Verbesserungen etc, geben könnten :).
Der Logik Thread sendet ausschließlich, der Render Thread empfängt.
Übermittelt werden: Position, Roation, Animationsdaten ( z.B.: Animation soll gestartet werden; Skalierungen, etc)
Was ich bei meiner Suche als Kommunikationsmittel für die Threads gefunden habe sind PipedStreams.
Wenn ich nun also im Logik Thread z.B. ein Entity/NPC habe und am Ende des updates dieses meine Daten in den PipedStream screibe sollte das ungefähr so aus sehen:
//x ist Integer wert und muss in seine Bytes zerlegt werden
pout.write(pos.x&0xFF)
pout.write(pos.x&0x00FF)
pout.write(pos.x&0x000FF)
pout.write(pos.x&0x000000FF)
pout.write(pos.y&0xFF)
pout.write(pos.y&0x00FF) //Markierung 1
pout.write(pos.y&0x000FF)
pout.write(pos.y&0x000000FF)
//und so weiter
pout.flush();
Mögliche Probleme :
- Ich muss für jedes Entity und den dazugehörigen Rednerer einen PipedStream mit einem begrenzten Puffer anlegen, dies muss dann in einem gemeinsamen Thread passieren
- Es könnte passieren dass der InputStream die Daten abfragt während der Outputstream erst einen Teil der Daten hineingeschrieben hat (z.B.: an Markierung 1), die Reihenfolge im Puffer wäre komplett durcheinander, und das Ergebnis wohl absolut unbrauchbar
3)Ich habe keine Ahnung wie ich mithilfe des Piped Streams übermitteln soll welche Animation gestartet, bzw. gestoppt werden soll
Schon mal vielen Dank fürs durchlesen dieses ganzen Textes
MfG,
~Oneric