|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
RayJunx JLI'ler
Alter: 43 Anmeldedatum: 16.01.2006 Beiträge: 130 Wohnort: Bayern Medaillen: Keine
|
Verfasst am: 21.07.2006, 16:17 Titel: Multiplayerspiele - Netzwerkeinbindung, Generelles, Probleme |
|
|
Hi All!
Bin gerade mit ein paar Freunden am experimentieren was Multiplayer angeht, aber noch keiner hat wirklich Erfahrung was das angeht.
Einfaches Beispiel... nehmen wir an wir wollen ein ganz einfaches Spiel spielen. Jeder Spieler läuft mit seiner figur auf einer 2D gekachelten landschaft umeinander. Das soll gleichzeitig über LAN oder das internet geschehen. So wie binden wir das ein... erstmal geht es um den Grundaufbau, welche Struktur... gibt es einen Server der das ganze Spiel verwaltet und alle berechnungen durchführt, oder macht das jeder client selbst und der Server Synchronisiert nur?
nächstes Problem, die bewegung der Spieler soll ja sehr flüssig ablaufen, sagen wir 60Frames die sekunde oder schneller je nach bildrate, entsprechend auch die Berechnungen und Eingabeverwertung des Spielers. Die Syncro über den server dürfte aber keine ahnung langsamer sein, bei pings zwischen 10 und 100millisecs also ca 100bis10 frames die sekunde. wenns schlecht geht und jemand aus japan mitspielt, haben wir also 10 syncs die sekunde. Was dann? wir können dann nicht jedes Spielframe die daten abgleichen. Dann müßte das spiel praktisch ein stück weit "blind bzw autark" laufen... Wie handelt man sowas?
Wenn zum Beispiel keine Spieler gleichzeitig auf ein Kachelfeld laufen dürfen, kann ich das ja prüfen wenn ich jede runde weiß was der andere getan hat, wenn ich das aber nur alle 10 runden geupdatet bekomme... was mach ich da? davon ausgehen das er jetzt an mehreren punkten sein kann? no matter. Hat jemand von Euch Erfahrung bei sowas? Würde mich über Euer Feedback sehr freuen.
Grüße an alle,
Euer RayJunx _________________ Just a Freak |
|
Nach oben |
|
|
Dragon Super JLI'ler
Alter: 38 Anmeldedatum: 24.05.2004 Beiträge: 340 Wohnort: Sachsen Medaillen: Keine
|
Verfasst am: 21.07.2006, 17:13 Titel: |
|
|
Multiplayerspiele sind eine etwas kompliziertere Sache als normale Spiele. Wir haben bei Tournament ein System, dass Serverobjekte automatisch bei den Clients anmeldet, bewegt und löscht. Alles besiert auf Events. Ist für dich vieleicht etwas schwierig umzusetzen, darum will ich dir ein einfaches Bespiel bringen.
Erstmal etwas Theorie
Es gibt verschiedene Architekturen: Client-Server und Peer2Peer. Bei Client-Server gibt es einen Obermacker der für das Spiel zuständig ist. Alle Nachrichten von den Clients gehen erst an den Server und werden dann evtl. weitergeleitet oder verarbeitet. Bei Peer2Peer sind alle Mitspieler gleichberechtigt, d.h. du musst die Nachricht von einem Client an alle Clients verschicken. Vorteil bei dieser Methode ist, dass wenn der Spielstarter das Spiel verläst das Spiel trotzdem weiterläuft. Bei Client-Server wird das Spiel beim runterfahren des Server beendet.
Folgendes Szenario: Es sollen sich 2 Akteure auf einer Fläche bewegen.
Erstmal müssen die Clients in Kontakt treten. Entweder mit Peer2Peer oder über einen Server. Ein Client aber auch zugleich Server sein. Klingt etwas verwirrend ^^. Okey, zurück zum Thema. Wenn sich also ein Client anmeldet muss ein Akteur für ihn erzeugt werden. Der Benutzer macht seine Eingaben und bewegt die Figur damit. Je nach dem, welche Architektur kannst du die eingaben verschieden übertragen. Bei einer Client-Server architektur kann man das wie folgt machen. Man schickt ein Packet mit dem Inhalt "Bewege mal meinen Akteur nach links" an den Server. Der Server bewegt nun den Akteur des Clients auf dem Server und sendet die neue Position sowie Bewegungsdaten für evtl. Interpolation an alle Clients, auch an den Packetsender. Bei einer Peer2Peer-Architektur kann man die Postions- und bewegungsdaten, ich wiederhole mich, für evtl Interpolation. Meldet sich ein Client vom Spiel ab oder Timeout, dann wird der Akteur aus dem Spiel gelöscht.
Zum Thema Ping: Der Ping kann einem ganz schön zum Verhängnis werden. Bei einen hohen Ping kommt es zu extremen verzögerungen. Das lässt sich aber mit etwas Makeup verschönern. Z.B. kannst du die bewegung erst etwas schneller machen, bis es wieder mit der Server-Version synchron ist und dann normal bewegen. Dafür brauch man dann die Bewegungsdaten. Kann in form eines Vectors sein aber auch in Form von einem Feld für Links, Rechts, blablablub.
Okey, ich hoffe, das kann die eine kleine Hilfe sein. Für weitere Informationen steh ich dir zu verfügung. Eine gute seite ist www.gamedev.net da einfach mal bei Network reinschauen, da gibt es massig tutorials.
Achso, ein paar Netzwerkprogrammiertipps: Immer nur dann Daten senden, wenn sich auch wirklich was ändert, aber nicht jeden Frame. Die Daten immer klein halten und Absolute daten für absolute Positionierung verwenden. _________________ Nur wenn man ein Ziel sieht, kann man es auch treffen.
___________
Mein Leben, Freunde und die Spieleentwicklung |
|
Nach oben |
|
|
FH Super JLI'ler
Alter: 36 Anmeldedatum: 16.10.2004 Beiträge: 438
Medaillen: Keine
|
Verfasst am: 21.07.2006, 20:42 Titel: |
|
|
Nochwas zu der Frage, was man macht, wenn man keine neuen Daten hat: Ich würde, wie Dragon sagte, einfach nen Bewegungsvektor mitschicken, so dass die anderen praktisch zumindest ungefähr mitrechnen können, wo sich der andere befindet. Wenn sie dabei etwas entschieden ändert, hat der langsame Client halt mehr oder minder gelitten. Angenommen, er rennt zu einem Teleporter, auf dem er sich wegbeamt. Kurz bevor er auf dem Ding draufsteht, kommen einige Zeit lang keine Daten mehr von ihm zum Server. Wenn er in dieser Zeit abgeschossen wird, hat er halt gelitten...
Gruß
FH _________________ goto work, send your kids to school
follow fashion, act normal
walk on the pavement, watch T.V.
save for your old age, obey the law
Repeat after me: I am free |
|
Nach oben |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 23.07.2006, 14:53 Titel: |
|
|
Was meine beiden Vorgänger gesagt haben ist richtig.
Außerdem ist es wichtig, dass du deine Net Events in RELIABLE(MUSS ankommen) und UNRELIABLE(nicht so dringend, wird aber häufiger gesendet) aufteilst.
Beispiele für reliable: Spieler stirbt, Neuer Map wird geladen, ein Entity wird gespawnt
Beispiele für unreliable: Spielerbewegung aller Art.
Außerdem würde ich dir empfehlen mit jedem Päckchen einen Zeitstempel mitzuschicken. Wenn ein Spieler zum Zeitpunkt 10 losrennt und das Paket bei den anderen erst 20 ticks später ankommt, dann musst du die Bewegung extrapolieren damit das Spiel einigermaßen synchron läuft. Wo wir gerade beim Thema sind: Die Clients sollten folgende wichtige Techniken beherrschen: Interpolation(Bewegung und Rotation), Extrapolation(hier das gleiche) und Prediction(Annahmen machen auf Grund älterer Daten um Lag zu kompensieren).
Es gibt im Netz zu den Themen einen Haufen interessanter Artikel und wirklich schwer ist das nicht umzusetzen. _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
|
Chriss Senior JLI'ler
Anmeldedatum: 18.08.2004 Beiträge: 267
Medaillen: Keine
|
Verfasst am: 25.07.2006, 10:22 Titel: |
|
|
Hazel hat Folgendes geschrieben: |
Außerdem würde ich dir empfehlen mit jedem Päckchen einen Zeitstempel mitzuschicken.
|
Ich denke mal das dieser Zeitstempel eine Schrittweite von 1ms haben soll. Allerdings bekommt man nach einer Weile das Problem das die Variable zu klein ist und wieder bei 0 anfangen muss. Aber trotzdem können wegen eines schlechten PING Päckchen ankommen die noch einen Zeitstempel vor dem Wechsel zu 0 haben.
Hat jemand eine Idee wie man damit umgehen kann ohne das Spiel damit auszubremsen?
Ein Weiteres Problem ist das nicht jeder Rechner mit seinem Zeitstempel gleich anfängt also muss der Startwert vom Server geholt werden. Da dieser wiederum mit Verzögerung zum Client geschickt wird muss mann das auch berücksichtigen.
Weiß hier jemand wie man die Verzögerung zwischen Client und Server bekommt? |
|
Nach oben |
|
|
GreveN JLI Master
Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 25.07.2006, 11:05 Titel: |
|
|
Naja, eine 4 Byte 'unsigned long' kennt 2^32 Werte. Das heißt, das Spiel müsste 4294967296 Millisekunden laufen, bevor der Zeitstempel auf 0 springen würde, das wären ~4294967 Sekunden oder anders ausgedrückt ~71583 Minuten, was ~1193 Stunden entspricht, was immerhin knapp 50 Tage sind.
Wenn man einen kleineren Typ für den Stempel nutzt, überall synchron bei 0 beginnt, könnte man ja irgendwie global refreshen wenn die Zeit um ist und alle eventuell noch umher streunenden, älteren Päckchen ungültig machen oder so. |
|
Nach oben |
|
|
Chriss Senior JLI'ler
Anmeldedatum: 18.08.2004 Beiträge: 267
Medaillen: Keine
|
Verfasst am: 25.07.2006, 11:52 Titel: |
|
|
Ok einen kleinen Aussetzer nach 50 Tagen kann man wohl verkraften
Das globale Synchronisieren würde ja noch gehen wenn man den Stempel des Servers anforder und die halbe Pingzeit adiert. Nur wie bekommt man die Pingzeit raus? Gibt es bei den Sockets was fertiges? UDP und TCP fallen ja eigentlich flach da Ping ein niedrigeres Protokoll verwendet. |
|
Nach oben |
|
|
abc_d JLI Master Trainee
Alter: 34 Anmeldedatum: 27.01.2003 Beiträge: 615
Medaillen: Keine
|
Verfasst am: 25.07.2006, 12:09 Titel: |
|
|
ICMP ist in der gleichen Schicht wie TCP oder UDP. Ich denke nicht das das klappt was du vorhast, die Latenzzeit (ping) kann man nicht vorausberechnen, sie ist bei jedem Paket unterschiedlich. _________________ http://mitglied.lycos.de/sarti/linuxisevil.gif Linux is evil - get the fact.
Never touch a running System - der Systemling |
|
Nach oben |
|
|
Dragon Super JLI'ler
Alter: 38 Anmeldedatum: 24.05.2004 Beiträge: 340 Wohnort: Sachsen Medaillen: Keine
|
Verfasst am: 25.07.2006, 13:16 Titel: |
|
|
BlackLordOfDragons hat Folgendes geschrieben: | ICMP ist in der gleichen Schicht wie TCP oder UDP. Ich denke nicht das das klappt was du vorhast, die Latenzzeit (ping) kann man nicht vorausberechnen, sie ist bei jedem Paket unterschiedlich. |
Das ist das selbe Problem wie beim Rendern. Nich jeder Frame brauch genau solange wie der vorherige. Man könnte aber auch einen Durchschnittswert für den Ping nehmen. _________________ Nur wenn man ein Ziel sieht, kann man es auch treffen.
___________
Mein Leben, Freunde und die Spieleentwicklung |
|
Nach oben |
|
|
abc_d JLI Master Trainee
Alter: 34 Anmeldedatum: 27.01.2003 Beiträge: 615
Medaillen: Keine
|
Verfasst am: 25.07.2006, 21:57 Titel: |
|
|
Ok, da gebe ich dir recht.
Jetzt wo ich darüber nachdenke, denke ich das man die Latenzzeit dadurch herausfindet, das man ein Paket verschickt, und wartet bis die Antwort kommt, die Zeitdifferenz ergibt die Latenzzeit. Das ist viel besser, das auch die Verarbeitung der Pakete berücksichtigt wird. _________________ http://mitglied.lycos.de/sarti/linuxisevil.gif Linux is evil - get the fact.
Never touch a running System - der Systemling |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 02.08.2006, 21:53 Titel: |
|
|
Ich hab mir auch schnomal Gedanken darüber gemacht.
Im Pirnzip ist es ein sehr schweres Thema, und nie perfekt zu lösen.
Zum Beispiel sollte es ja zu Anno 1503 einen MP Patch geben, der leider nix gegeben hat, und die haben estimmt keine Anfänger- oder Hobbyprogrammierer...
Naja, bei Netzwerk hat man wohl weniger Probleme, mehr Kapazität, kürzere Zeiten usw.
nachdem ich n bisschen rumexperimentiert hab, wollte ich ersteinmal SP Siele machen. Neztwerk ist wirklcih eines der schwersten Themen die es gibt... _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 02.08.2006, 22:02 Titel: |
|
|
@Anno: Gross MP Modus Ankündigen aber Spielgerüst nicht darauf auslegen, haha, das schaffen aber wirklich diverse Hobbyprogrammierer besser. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
abc_d JLI Master Trainee
Alter: 34 Anmeldedatum: 27.01.2003 Beiträge: 615
Medaillen: Keine
|
|
Nach oben |
|
|
OLiver Super JLI'ler
Alter: 33 Anmeldedatum: 29.06.2003 Beiträge: 306 Wohnort: Jena Medaillen: Keine
|
Verfasst am: 03.08.2006, 08:51 Titel: |
|
|
Jonathan_Klein hat Folgendes geschrieben: |
Zum Beispiel sollte es ja zu Anno 1503 einen MP Patch geben, der leider nix gegeben hat, und die haben estimmt keine Anfänger- oder Hobbyprogrammierer...
Naja, bei Netzwerk hat man wohl weniger Probleme, mehr Kapazität, kürzere Zeiten usw.
nachdem ich n bisschen rumexperimentiert hab, wollte ich ersteinmal SP Siele machen. Neztwerk ist wirklcih eines der schwersten Themen die es gibt... |
Bei (Echtzeit-)Strategiespielen läuft das aber ein bisschen anders. Dort wird das Spiel in der Regel in "Netzwerk-Frames" eingeteilt (z.B. so alle 500 ms), in denen dann alle wichtigen spielentscheidenden Aktionen ausgeführt werden (z.B. eine Kaserne produziert eine Einheit) und auch Befehle der einzelnen Spieler werden immer bei jedem Client genau auf demselben Frame ausgeführt (Bewege Einheit sowieso nach x;y). Deswegen werden auch die Befehle immer einen Frame früher schon losgeschickt, damit sie dann im nächsten erst ausgeführt werden und so bei allen Spielern zur gleichen Zeit. Auch wenn ein Spieler keinen Befehl erteilt für einen Frame, was ja sehr häufig auch der Fall ist, dann sendet er trotzdem eine Art "Frame done" - Message. Wenn jetzt ein Client oder auch der Server zu Beginn des nächsten Frames feststellt, dass nicht von allen Spielern die Befehle für diesen Frame da sind, wird das Spiel pausiert und gewartet bis sie eintreffen, das wären dann die berühmten Lags. Dadurch ist es theoretisch unmöglich, dass irgendwas asynchron wird, wenn niemand irgendwelchen Mist sendet oder versucht zu cheaten. Nachteil ist natürlich, dass es bei jedem ausgeführten Befehl ne kleine Verzögerung im Spiel gibt, die man aber auch mehr oder weniger verstecken kann. Für mein Siedler2-Remake mach ich das auch so und es klappt recht gut. Man muss es halt nur von anfang an einbauen und das haben die Entwickler von Anno garantiert nicht gemacht und deshalb denke ich, dass sie auch nicht gerade erfahrene Netzwerkprogrammierer hatten (zumal sie ja noch erst DirectPlay genommen haben... ) _________________ http://www.sieder25.org/ (Siedler 2 - Remake) |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 03.08.2006, 10:45 Titel: |
|
|
ja stimmt, höchstwahrshceinlich lag es an der gesamt Konzeption des Spiels, das der Multiplayer teil so schwierig einzubauen wurde.
Diese Eventsystem ist natürlich eine gute Möglichkeit, wahrshceinlich sogar die beste. Aber therretisch ist es immernoch minimal asynchron, da die Befehle ja zum Beispiel zu einem ein wenig länger brauchen könnten, oder jemand der nur die halbe Framerate hat, doppelt so lange warten muss, bis die neuen Situation dargestellt wird. Die Unterschiede sind natürlich minimal und gerade wenn alles zentral berechnet wird, kann das eigentlich kaum auffallen. Aber perfekt synchron ist es nicht _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|