Netzwerk-Spiele und Techniken zur Synchronisation
Übersicht

![]() |
JolinahBetreff: Netzwerk-Spiele und Techniken zur Synchronisation |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo zusammen,
Wer schon mal ein Netzwerk-Spiel programmiert hat - oder es zumindest versucht hat - dem ist bestimmt schon aufgefallen dass die technische Seite der Netzwerkprogrammierung noch das kleinste Übel ist. Selbst wenn man ein auf UDP aufbauendes Protokoll hat, welches sowohl sichere wie auch unsichere, geordnete und ungeordnete Nachrichten zulässt, so kann man damit trotzdem nur ein paar Positionen und Werte übertragen. Das Problem das bleibt ist folgendes: Jede Nachricht kommt mit einer leichten Verzögerung beim Empfänger an (ping oder rtt = round trip time). Ausserdem kann man schlecht in jedem einzelnen Frame eine Nachricht senden. Je nach Verbindung gerät dann alles ins stocken und es würde auch mehr Bandbreite verbrauchen. Das Hauptproblem ist somit, dass der Empfänger nur sporadisch Positionen etc. erhält (vergleichbar mit Sampling/Abtastrate, wem das was sagt). Wie stellt man nun trotzdem alles flüssig dar? Hierzu gibt es im wesentlichen 2-3 Techniken die angewandt werden können. Da ich selber zur Zeit an einem Netzwerk-Spiel arbeite, habe ich ein "kleines" Tool geschrieben, welches diese unterschiedlichen Techniken simuliert. Das Tool verwendet selber absolut kein Netzwerk, nur um zu zeigen dass das Problem eigentlich nichts mit Netzwerk zu tun hat. Es wurde mit Unity erstellt (für mich persönlich das neue "Blitz3D", besitze sogar eine gekaufte Pro-Lizenz, das Tool wurde aber mit der Gratis-Version erstellt.). Es kann direkt im Internet mit Hilfe eines Browser-Plugins (sehr schnelle Installation) angeschaut werden: http://mzehr.ch/NetTest Die wesentlichen Techniken sind: Interpolation, Extrapolation und Client Prediction, das letzte ist wohl auch unter "dead-reckoning" bekannt, ist aber auch möglich dass das nochmal etwas anderes ist ![]() http://playerio.com/documentat...ronization Es tut mir leid, dass das nichts mit Blitz zu tun hat, und ich will auch nicht Werbung machen oder so, sondern es geht mir hier wirklich um diese Synchronisations-Techniken. Dieses Tool ist das Ergebnis von 3-4 Jahren rumprobiererei bei diversen Netzwerkspielen. Das Tool selbst ist nun aber, nachdem ich diese Erfahrungen machen konnte, in 2 abenden entstanden. Wer weitere Fragen dazu hat, darf diese gerne stellen ![]() Edit: Noch eine kurze Erklärung zur Bedienung: Der Kreis im oberen Feld kann direkt mit den Pfeil-Tasten oder w,s,a,d gesteuert werden. Mit der Leertaste kann man ausserdem einen starken Schub auslösen. Im unteren Feld sieht man das Abbild von dem oben, so als würde ein anderer Spieler über Netzwerk diesen Kreis beobachten, unter Verwendung der aktivierten Technik. Weiterhin lässt sich die Pingzeit einstellen (in Sekunden). Dies verursacht dass alle Positions-Updates für "den anderen Spieler" verzögert werden. Die Sende-Rate bestimmt wie oft überhaupt ein Positions-Update gesendet wird. Hier ist zu beachten dass wenn nur alle 0.5 Sekunden ein Update gesendet wird, natürlich auch die Bewegungen je nach Technik nicht mehr genau rekonstruiert werden können, da 2 Positionen in der Sekunde einfach zu wenig sind. Im Feld Packetloss wird ein Faktor definiert, wie viele Nachrichten dass gedropt werden (nicht ankommen). Bei 0 kommt jedes Update immer an, bei 1.0 wird gar nichts mehr gesendet. Der Grund dass er sich bei Client Prediction dann trotzdem bewegt, liegt in der Client Prediction selbst, da diese die Bewegung des Spielers auch lokal ausführt und durch Positions-Updates nur korrigiert. Bei der Interpolation sollte die Interpolations-Zeit mindestens der Sende-Rate entsprechen. Ansonsten kann nur noch ein Teilstück der Bewegung oder gar nichts mehr interpoliert werden. Ausserdem muss auch der Buffer gross genug gewählt werden. Dieser gibt an, wie viele Positions-Updates maximal zwischengespeichert werden. Der richtige Wert hängt von der Interpolationszeit und der Sende-Rate ab. Angenommen es sollen für 1s Daten zwischengespeichert werden und die Sende-Rate beträgt 20/s, dann braucht es mindestens 20-25 gepufferte Updates, bei einer halben Sekunde wäre es auch die Hälfte usw.. |
||
![]() |
Tankbuster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du schummelst doch! ![]() |
||
Twitter
Download Jewel Snake! Windows|Android |
![]() |
Jolinah |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hehe ![]() Naja, die Client Prediction lässt ja im Prinzip die Physik des eigenen Spielers lokal ebenfalls laufen und korrigiert wenn Updates vom Server kommen. Da aber bei 100% Datenverlust keine Updates kommen wird nie etwas korrigiert und er lässt sozusagen einfach die Physik komplett lokal laufen. Dass die Zustände dann übereinstimmen liegt nur daran dass alles im gleichen Programm läuft, mit gleicher FPS usw.. In der Realität sähe das wohl anders aus. Aber wenn du z.B. den Verlust auf 0.5 setzt und die Sende-Rate auf 0.2, und dann ein paar mal den "Boost" mit der Leertaste einsetzt, gibts schon Situationen wo man dann sieht wie er korrigiert. Wie gesagt, in der Praxis läuft halt beides in unterschiedlichen Programmen und nicht genau gleichzeitig ab, dann muss er vermutlich öfter eingreifen. Ich bin mir sicher, dass es auch noch weitere Ansätze gibt (z.B. kann die Interpolation statt linear auch kubisch gemacht werden etc.). Beim Netzwerk ist es ja meistens so, dass jedes Spiel seine eigene individuelle Lösung braucht, je nach Anforderungen. Meistens kommen mehrere Techniken gleichzeitig zum Einsatz. Und oft wird auch einfach ein bisschen getrickst, Dinge die der Spieler nicht bemerkt ![]() Wer interessiert ist an was für Netzwerk-Games ich zusammen mit einem Freund arbeite: - Ein 3D-Fussball (momentan pausiert, aufgrund eines Problems mit der Motion Capturing Software die wir eingesetzt hatten) - So eine Art stark vereinfachtes 2D-Fussball, abgeschaut von HaxBall.com, mit dem Ziel Dedicated Server anzubieten, statt nur Peer 2 Peer. Und dazu auch User-Accounts usw.. - Ein Remake vom Nintendo-Spiel "Metal Marines" in 3D, aber aus ISO-Perspektive. Eigentlich wollte ich ja keine Werbung machen (daher der Link auch nur klein), aber ein Bild/Video zu den Spielen sagt mehr als tausend Worte: http://blog.bytetrail.de |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group