Wieder einmal Netzwerkcode - Anregungen gesucht
Verfasst: 26.02.2021 09:43
Hallo zusammen,
im letzten Jahr habe ich mit Freunden an einem kleinen 2D-Brettspiel-Simulator gearbeitet (eine einfach zu bedienende Alternative zum Tabletop-Simulator), den wir online über Remotezugriff bedient haben. Nun bin ich am überlegen das Tool auf die nächste Ebene zu heben und denke über einen Netzwerkcode nach. Das letzte mal, dass ich Netzwerk programmiert habe ist schon ein paar Jährchen her und war damals nur ein simples Kartenspiel. All zu komplex gestaltet es sich diesmal aber auch nicht (keine KI, nur das verschieben von Sprites mit der Maus und ändern von Statuswerten wie Hitpoints). Dennoch stellen sich mir ein paar Fragen, die ich gerne mit euch durchdiskutieren würde, bzw. großes Interesse an euren Erfahrungen habe:
1.) Umgang mit Benutzereingaben
Am einfachsten ist es mit einem Spieler als Server und den übrigen Spielern als Clients. Aber wie geht man am besten mit Manipulationen z.B. dem Löschen von Elementen aus einer LinkedLists oder der Veränderung von Variablenwerten um. Macht es Sinn, dass ein Client das Element bei sich direkt löscht und dann an den Server das Löschen kommuniziert oder ist es sicherer dem Server mitzuteilen, dass man etwas löschen möchte und der Server verteilt dann die Aufgabe an alle Clients (inkl. einen selbst)? D.h. nicht geschieht ohne die Aufforderung des Servers.
2.) Genereller Umgang mit LinkedLists
Wie halte ich LinkedLists am besten bei allen Teilnehmer synchron? Ich sehe z.B. das Problem dass Spieler 1 Element 5 löscht und Spieler 2 gleichzeitig Element 6. Abhängig davon in welcher Reihenfolge die Information bei Spieler 3 ankommt, wird dort dann entweder 5 & 6 (Spieler 2 war zuerst) oder 5 & 7 (Spieler 1 war zuerst und das 7. Element ist dann das 6.) gelöscht. Momentan sehe ich nur die Möglichkeit, dass jedes Element der Liste vom Server einen Unique-Identifier bekommt, was es etwas umständlicher macht. Oder gibt es hier elegantere Lösungen?
3.) Nachverfolgen von Bewegungen
Wenn ein Sprite in Echtzeit mit der Maus auf dem Bildschirm verschoben werden soll, wie kommuniziert man dies am besten an den Server/die übrigen Clients? Macht es es Sinn die einzelnen Positionen des Objekts zu übermitteln oder wird das zu sehr laggen und zuviel Traffic verursachen? Wäre es besser Vektoren für die Bewegung zu berechnen und die Clients verfolgen die Bewegung anschließend etwas Zeitversetzt nach?
4.) Umgang mit Paketverlust und fehlerhaften Paketen
Das ist auch ein Punkt aus dem ich nicht schlau geworden bin. Kümmert sich der PureBasic Netzwerk-Unterbau selbständig darum verlorene oder fehlerhafte Pakete beim Absender erneut anzufragen oder muss ich mich darum selbst kümmern?
Ich bin gespannt auf eure Erfahrungen, hoffe auf Diskussionen und sage schon mal danke für eure Unterstützung.
im letzten Jahr habe ich mit Freunden an einem kleinen 2D-Brettspiel-Simulator gearbeitet (eine einfach zu bedienende Alternative zum Tabletop-Simulator), den wir online über Remotezugriff bedient haben. Nun bin ich am überlegen das Tool auf die nächste Ebene zu heben und denke über einen Netzwerkcode nach. Das letzte mal, dass ich Netzwerk programmiert habe ist schon ein paar Jährchen her und war damals nur ein simples Kartenspiel. All zu komplex gestaltet es sich diesmal aber auch nicht (keine KI, nur das verschieben von Sprites mit der Maus und ändern von Statuswerten wie Hitpoints). Dennoch stellen sich mir ein paar Fragen, die ich gerne mit euch durchdiskutieren würde, bzw. großes Interesse an euren Erfahrungen habe:
1.) Umgang mit Benutzereingaben
Am einfachsten ist es mit einem Spieler als Server und den übrigen Spielern als Clients. Aber wie geht man am besten mit Manipulationen z.B. dem Löschen von Elementen aus einer LinkedLists oder der Veränderung von Variablenwerten um. Macht es Sinn, dass ein Client das Element bei sich direkt löscht und dann an den Server das Löschen kommuniziert oder ist es sicherer dem Server mitzuteilen, dass man etwas löschen möchte und der Server verteilt dann die Aufgabe an alle Clients (inkl. einen selbst)? D.h. nicht geschieht ohne die Aufforderung des Servers.
2.) Genereller Umgang mit LinkedLists
Wie halte ich LinkedLists am besten bei allen Teilnehmer synchron? Ich sehe z.B. das Problem dass Spieler 1 Element 5 löscht und Spieler 2 gleichzeitig Element 6. Abhängig davon in welcher Reihenfolge die Information bei Spieler 3 ankommt, wird dort dann entweder 5 & 6 (Spieler 2 war zuerst) oder 5 & 7 (Spieler 1 war zuerst und das 7. Element ist dann das 6.) gelöscht. Momentan sehe ich nur die Möglichkeit, dass jedes Element der Liste vom Server einen Unique-Identifier bekommt, was es etwas umständlicher macht. Oder gibt es hier elegantere Lösungen?
3.) Nachverfolgen von Bewegungen
Wenn ein Sprite in Echtzeit mit der Maus auf dem Bildschirm verschoben werden soll, wie kommuniziert man dies am besten an den Server/die übrigen Clients? Macht es es Sinn die einzelnen Positionen des Objekts zu übermitteln oder wird das zu sehr laggen und zuviel Traffic verursachen? Wäre es besser Vektoren für die Bewegung zu berechnen und die Clients verfolgen die Bewegung anschließend etwas Zeitversetzt nach?
4.) Umgang mit Paketverlust und fehlerhaften Paketen
Das ist auch ein Punkt aus dem ich nicht schlau geworden bin. Kümmert sich der PureBasic Netzwerk-Unterbau selbständig darum verlorene oder fehlerhafte Pakete beim Absender erneut anzufragen oder muss ich mich darum selbst kümmern?
Ich bin gespannt auf eure Erfahrungen, hoffe auf Diskussionen und sage schon mal danke für eure Unterstützung.