Programm auf allen PC's gleich schnell

Für allgemeine Fragen zur Programmierung mit PureBasic.
DerMeister
Beiträge: 28
Registriert: 30.12.2009 19:20

Programm auf allen PC's gleich schnell

Beitrag von DerMeister »

Hallo an alle
Ich will ein netzwerkfähiges Computerspiel machen. Dabei soll das Spiel auf allen PC's selbst simuliert werden, per Netzwerk sollen nur Updates geschickt werden.
Also ein Spieler hat zB eine bestimmte Geschwindigkeit. Solange er die hat wird er auf allen Rechnern mit dieser Geschwindigkeit in eine bestimmte Richtung bewegt.
Wenn jetzt der Spieler seine Geschwindigkeit/Richtung ändert wird ein Update an alle geschickt und das nun jeweils angepasst.
Dabei hab ich mir gedacht es kann ein Problem geben wenn das Spiel auf unterschiedlichen Rechnern unterschiedlich schnell läuft.
Also nach 10 Sekunden ist bei einem PC der Spieler bereits viel weiter gelaufen als auf einem anderen PC.
Ich hab folgenden Thread gefunden, der sich anscheinend mit diesem (ähnlichen oder gleichen) Thema beschäftigt:

http://forums.purebasic.com/german/view ... =8&t=24739

Ganz am Anfang ist dort ein Codestück, wobei mir nicht vollkommen klar ist, ob das Problem dadurch gelöst wird. Hat jemand Vorschläge oder kann etwas beitragen?
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Programm auf allen PC's gleich schnell

Beitrag von STARGÅTE »

Du wirst nicht drum rum kommen, die Position selbst zu synchronisieren.
Denn selbst wenn die Spieler alle gleich schnell wären, würde das Update-"Paket" ja nicht bei allen gleichzeitig ankommen (aufgrund von PING, LAG usw.)

Neben den neuen Geschwindigkeiten, soltle also auch die Position gesendet werden, sodass Spieler "korrigiert" werden.
Dafür verwendet man im übrigen gerner UDP, weil es schneller ist und bei Positionsupdate eine fehlerhafte Übertragung nicht so tragisch ist, dann wirds halt beim 2. korrigiert.

Zum eigentlichen Problem:
Wenn du weißt, der Spieler soll in 10s 500px oder so laufen, dann nutzt du die Zeit selbst als Positionswert:
Position = StartPosition + (ElapsedMilliseconds()-Empfangszeit)*Geschwindigkeit ; In Pixel pro Millisekunde.

So wird wirklich zu jedem Zeitpunkt die wahre Position zurückgegeben, bis ein neues Update kommt und StartPosition und Empfangszeit erneuert werden.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
DerMeister
Beiträge: 28
Registriert: 30.12.2009 19:20

Re: Programm auf allen PC's gleich schnell

Beitrag von DerMeister »

Danke für die Antwort!
STARGÅTE hat geschrieben:Du wirst nicht drum rum kommen, die Position selbst zu synchronisieren.
Denn selbst wenn die Spieler alle gleich schnell wären, würde das Update-"Paket" ja nicht bei allen gleichzeitig ankommen (aufgrund von PING, LAG usw.)

Neben den neuen Geschwindigkeiten, soltle also auch die Position gesendet werden, sodass Spieler "korrigiert" werden.
Dafür verwendet man im übrigen gerner UDP, weil es schneller ist und bei Positionsupdate eine fehlerhafte Übertragung nicht so tragisch ist, dann wirds halt beim 2. korrigiert.
Ja stimmt, wahrscheinlich ist der Lag der durchs Netzwerk entsteht sogar das größte Problem dabei. Macht es eigentlich Sinn für alle Nachrichten UDP zu nehmen, oder nur speziell für die Positionsbenachrichtigungen? Wie oft sollten eigentlich die Positionsupdates kommen, ist das evtl. sinnvoll es abhängig von der Anzahl der Objekte für die Updates geschickt werden zu machen?

Vielleicht etwas OT, aber ich hätte auch noch eine Frage zum Server:
Ist es generell sinvoller die Serverfunktionalität ins Hauptprogramm (in dem auch Grafik, Benutzereingabe etc stattfindet) einzubinden, oder ein eigenes Programm nur für den Server zu schreiben? Ein Singleplayer wäre dann halt ein Multiplayerspiel auf localhost.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Programm auf allen PC's gleich schnell

Beitrag von STARGÅTE »

DerMeister hat geschrieben:Macht es eigentlich Sinn für alle Nachrichten UDP zu nehmen, oder nur speziell für die Positionsbenachrichtigungen?
Nein. UDP ist für schnelle Aktualisierungen, wo die "genauigkeit" weniger wichtig ist.
Nachrichten sind ja Einzelne "wichtige" Objekte, die dann auch sicher mit TCP verschickt werden sollten.
für dein Spiel solltest du also sowohl ein TCP als auch ein UDP Server öffnen und verbinden.
DerMeister hat geschrieben:Wie oft sollten eigentlich die Positionsupdates kommen, ist das evtl. sinnvoll es abhängig von der Anzahl der Objekte für die Updates geschickt werden zu machen?
KOmmt ganz auch die "schnelligkeit" deines Spiel an.
Bei Egoshooter kommts manchmal auf wenige Millisekunden an, bei Strategie, kann die Einheit auch mal für n Sekunde "neben der Spur fahren".
Außerdem muss der Server dem Clienten ja auch nicht alle Positionen senden, sondern nur die, die er selber sieht. Denn dem Clienten interessiert es ja nicht, was "außerhalb" seiner Sicht passiert, da reicht es wenn der Server das weis.
DerMeister hat geschrieben:Ist es generell sinvoller die Serverfunktionalität ins Hauptprogramm (in dem auch Grafik, Benutzereingabe etc stattfindet) einzubinden, oder ein eigenes Programm nur für den Server zu schreiben? Ein Singleplayer wäre dann halt ein Multiplayerspiel auf localhost.
Der Server sollte zumindest eine eigene Prozedur haben, die dann ggf. auch selbstständig in einer eigenen Exe funktionieren könnte. Wenn viel im Spiel passiert, sollte der Server dann auch in einem eigenen Thread laufen oder halt eigene Exe

Externe Server sind aber immer besser, da man sie dann auch auf PCs "ohne" Grafikausgabe starten kann, zb für n 24/7 Server.
Die Komunikation läuft dann über die Console oder über das Netzwerk selbst.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
DerMeister
Beiträge: 28
Registriert: 30.12.2009 19:20

Re: Programm auf allen PC's gleich schnell

Beitrag von DerMeister »

OK cool, vielen Dank für die interessanten Informationen!
Antworten