JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=f9a45a47e53523cda5cbcc5a05db597cMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Multiplayerspiele - Netzwerkeinbindung, Generelles, Probleme

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
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

BeitragVerfasst am: 21.07.2006, 16:17    Titel: Multiplayerspiele - Netzwerkeinbindung, Generelles, Probleme Antworten mit Zitat

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 Wink
_________________
Just a Freak
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Dragon
Super JLI'ler


Alter: 38
Anmeldedatum: 24.05.2004
Beiträge: 340
Wohnort: Sachsen
Medaillen: Keine

BeitragVerfasst am: 21.07.2006, 17:13    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
FH
Super JLI'ler


Alter: 36
Anmeldedatum: 16.10.2004
Beiträge: 438

Medaillen: Keine

BeitragVerfasst am: 21.07.2006, 20:42    Titel: Antworten mit Zitat

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... Wink
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
Benutzer-Profile anzeigen Private Nachricht senden
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 23.07.2006, 14:53    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Chriss
Senior JLI'ler



Anmeldedatum: 18.08.2004
Beiträge: 267

Medaillen: Keine

BeitragVerfasst am: 25.07.2006, 10:22    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
GreveN
JLI Master


Alter: 38
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 25.07.2006, 11:05    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
Chriss
Senior JLI'ler



Anmeldedatum: 18.08.2004
Beiträge: 267

Medaillen: Keine

BeitragVerfasst am: 25.07.2006, 11:52    Titel: Antworten mit Zitat

Ok einen kleinen Aussetzer nach 50 Tagen kann man wohl verkraften Very Happy

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
Benutzer-Profile anzeigen Private Nachricht senden
abc_d
JLI Master Trainee


Alter: 34
Anmeldedatum: 27.01.2003
Beiträge: 615

Medaillen: Keine

BeitragVerfasst am: 25.07.2006, 12:09    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Dragon
Super JLI'ler


Alter: 38
Anmeldedatum: 24.05.2004
Beiträge: 340
Wohnort: Sachsen
Medaillen: Keine

BeitragVerfasst am: 25.07.2006, 13:16    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
abc_d
JLI Master Trainee


Alter: 34
Anmeldedatum: 27.01.2003
Beiträge: 615

Medaillen: Keine

BeitragVerfasst am: 25.07.2006, 21:57    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 02.08.2006, 21:53    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 02.08.2006, 22:02    Titel: Antworten mit Zitat

@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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
abc_d
JLI Master Trainee


Alter: 34
Anmeldedatum: 27.01.2003
Beiträge: 615

Medaillen: Keine

BeitragVerfasst am: 02.08.2006, 22:05    Titel: Antworten mit Zitat

Da kann ich mir dir nur anschließen Wink
_________________
http://mitglied.lycos.de/sarti/linuxisevil.gif Linux is evil - get the fact.

Never touch a running System - der Systemling
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
OLiver
Super JLI'ler


Alter: 33
Anmeldedatum: 29.06.2003
Beiträge: 306
Wohnort: Jena
Medaillen: Keine

BeitragVerfasst am: 03.08.2006, 08:51    Titel: Antworten mit Zitat

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. Wink 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... Rolling Eyes )
_________________
http://www.sieder25.org/ (Siedler 2 - Remake)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 03.08.2006, 10:45    Titel: Antworten mit Zitat

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 Wink
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
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

Impressum