Liebe Community,
ich bin gerade dabei für mein Studium ein Multiplayer-Spiel zu programmieren. Das Spiel besteht aus verschiedenen Spielern, die sich als Panzer gegeneinander abschiessen. Das ganze ist im Top Down gehalten. Ich benutze als Programmiersprache Java mit Libgdx und für das ganze Networking die Lib
Kryonet.
Diese ermöglicht mir relativ einfach event-basiert Anfragen entgegenzunehmen und zu verarbeiten. Das Spiel an sich steht schon, jedoch fehlt noch der Multiplayer-Part.
Noch was zur überlegten Architektur und zu den Anforderungen. Ich möchte gerne das Spiel als Client-Server realisieren wobei jeder ein Host sein kann und die anderen Joinen (das steht schon). Unterstützende Technologie sollte dabei TCP sein. Da das Spiel
NUR im LAN einigermassen flüssig laufen soll, verzichte ich auf den Gebrauch von UDP. Das sollte meiner Meinung reichen, da man im LAN ziemlich niedrige Latenzen hat.
Was ich schon habe: Der Host kann schon einen Server starten und die anderen können joinen. Dies wird auch bei allen korrekt dargestellt. Das Problem ist jetzt nun der eigentliche Austausch von Daten. Im Moment ist es jetzt so, dass ich als Client meine Aktion an den Server schicke (bewege nach rechts). Der Server reagiert event-basiert (Listener) auf die Nachricht, verschiebt den Spieler um die gewünschte Position und teilt dies allen Clients mit.
Dies ruckelt ziemlich stark und ich glaube das liegt an der event-basierten Logik. Was ich im Internet gefunden habe ist, dass man am besten ein FIFO Konstrukt verwenden soll und sobald eine Nachricht eintrifft, diese in die Warteschlange befördert. Parallel habe ich auf dem Server eine eigene Game-Loop, die jedes mal die erste Nachricht herauspickt und sie verarbeitet und allen Clients bescheid gibt, was sich geändert hat.
Btw. verschickt werden eigentlich ziemlich kleine Pakete mit Id des Spielers und den Koordinaten(x, y).
Ich hab mich versucht in die ganze Problematik einzuarbeiten mit Prediction, Interpolation usw. jedoch komme ich nicht auf einen grünen Zweig. Was mir wirklich helfen würde, wäre ein Codeschnipsel, der genau diese Problematik löst.
Nun zu meinen eigentlichen Fragen:
- Wäre das mit der Warteschlange ein guter Weg?
- Ist das der Fehler, der mein Spiel so ruckeln lässt? (wahrscheinlich wird da der Thread des Listeners blockiert, während ich am verarbeiten bin..)
- Ist im LAN Prediction und Interpolation überhaupt nötig?
Ich hoffe irgendwer kann mir helfen..
mfg
timi19