![]() |
[Netzwerk Logik]Problem mit Positions Synchronisation
Guten morgen liebe Epvpler,
ich habe jetzt schon einige Erfahrungen gesammelt im 2D Spiele Bereich und möchte mich nun an ein Netzwerk basiertes Spiel wagen. Ich habe allerdings ein paar Probleme bei der umsetzung. Insbesonder bei der Positions Synchronisation. Wie ich es geplant habe würde es im groben so ablaufen: Hier steht das > für das senden und empfangen etc. ;) Client bewegt sich > (Positions Packet) > Server Server überprüft ab bewegung "legal" wenn legal dann: Server > (Positions Packet) > Alle Clients Ergo: Bei allen Clients wird der Spieler auf die neue position gesetzt Ich habe aber das Gefühl das dieses System bei mehreren Clients zu Netzwerklastig ist. Beispiel: Server läuft auf angepasstem Linux Server hat eine 100 Mbit/s anbindung 564 Clients Online. Alle bewegen sich. Bei diesem Beispiel könnte ich mir Vorstellen das der Server ziemlich laggt. Da ich leider noch relativ neu in der Netzwerk Programmierung bin kann ich das ja nicht so gut einschätzen. Wenn dieses System zu Netzwerklastig ist, könntet ihr mir dann einen Vorschlag zeigen wie es besser ist ? Freu mich schon auf eure Antwort MFG Conrew |
spieler die außer sicht des zielclienten sind garnicht oder nur alle ~5 sekunden übertragen.
|
Quote:
|
Was hast du denn für gigantische Movepackets, dass 500 Clients reichen, eine 100 Mbit Leitung auszulasten?
|
Quote:
MFG Conrew |
Quote:
lässt es sich einfach beim Server anzeigen. |
Quote:
MFG Conrew |
Quote:
ansonsten einfach mal implementieren und ausprobieren, wozu gibts netzwerkmonitoringtools? |
ein movepacket dürfte doch nur ein paar kilobyte groß sein ? der server sollte di positionen aber abgleichen.
Ich würde die ja so senden : coordx|coordy|coordz|nochn paar andere sachen |
Ein paar Kilobytes? Das sollte doch weit unter einem sein (ein paar Bytes Daten + Header).
|
Quote:
Code:
Function|Parameter1|Parameter2|Parameter3|Parameter4|OptionalerParameter|Ip des absenders|ip des servers|ip von dem der die antwort empfängt|timestamp |
Quote:
Quote:
Header|posx|posy mehr brauch es ja nicht sein oder ? ;) ist ja nur 2D. Der Server macht die überprüfung usw. oder hat einer einen besseren Vorschlag ? Bin offen für alle Ideen MFG Conrew |
Quote:
Was spricht dagegen, das Paket so aufzubauen? Befehl:2 Bytes X: 8 Bytes Y: 8 Bytes Z: 8 Bytes Befehl entspricht der Funktion, X, Y und Z sind die Parameter. Wieso muss die IP des Servers übertragen werden? Wieso die IP des Clients? Wieso darf der Client bestimmen, welche andere Clients das Paket erhalten; wieso macht das nicht der Server (oder was ist mit "ip von dem der die antwort empfängt" gemeint)? Wieso ist der Timestamp hier relevant? Aber wenn er das ist, sind das nur vier Bytes mehr. Das sind dann insgesamt 26 bzw. 30 Bytes Daten (exklusive Verschlüsselung). (Mir ist schon klar, dass deine Variante mehr in Richtung RMI geht; aber ob das bei einem Spiel wirklich angebracht ist, halte ich für fragwürdig). |
Quote:
Empfängers/Senders ohnehin im Header steht. Wenn ich mal grob schätze dürfte ein TCP/IPv4 Packet 40byte + Daten haben. |
Quote:
|
Quote:
Zum anderen, gut geschätzt ;) IPv4 Header hat 20Byte + optionale Daten die nochmal maximal 40 Byte seien dürfen. Sollten also 60 seien, es seiden ich schmeiß irgendwas in meinem Kopf durcheinander. |
Quote:
Zumal die Verschlüsselung nichts an der Größe ändern sollte und eine binäre Speicherung von Daten, die keine Zeichenketten sind (z.B. Zahlen), weniger Platz benötigt, als sie erst in Strings umzuwandeln. |
Quote:
Grundsätzlich reicht für ein Movepacket folgender Aufbau: Header|PosX|PosY|PlayerID Was im gesamten nicht mehr als 13 Byte haben sollte. |
Quote:
Von der geröße her habe ich mich wohl ein wenig vertan denn wenn man das in eine datei schreibt und dann im windows explorer schaut sind de etwas größer |
Quote:
|
Quote:
MFG Conrew |
Quote:
|
Quote:
MFG Conrew |
Kommt immer ein wenig auf deine Ziele an, wieviele Clients peilste den an ?
Dein Ansatz Funktioniert sicher, eine ID vergibt man meist damit du die Perfomancelast nicht auf dem Server hast + du minimierst Probleme der Synchronisation wenn es auf deiner Seite nicht nur ein Server ist der das ganze regelt. Wenn das ganze um 5 Clients geht kannst es wohl genauso so machen wie du es vor hast :P |
Also es sollen schon ein paar mehr werden ^^ Was schlägst du den vor wenn ich mehr Clients habe ?
MFG Conrew |
Bei so einem Projekt musst du die beide Größten Herausforderungen bedenken.
a) Cycles und Speicher sind Kostbar b) Syncronisation zwischen deinen Servern muss nahezu Echtzeit sein, wenn du nicht in große Probleme rennen willst. Übergibst du die IDs direkt beim Movepacket musst du nurnoch gegenchecken ob der jeweilige client diese ID bewegen darf, schickst du sie nicht mit musst du sie zuordnen und dafür Sorge tragen das diese Temoräre ID jedem deiner Server bekannt ist, die es dann wieder auf die jeweiligen Sockets matchen müssen, dort die Temporäre ID die sie zu anfang für das jeweilige Objekt angelegt haben und diese Wiederrum neu zuweise oder die alt übernehmen. In jedem Fall wird es auf ne Menge "rumsuchen" rauslaufen und eine Suche ist etwas womit Computer einfach nicht gut fertig werden -> Perfomance ist mies dabei, deshalb möglichst andere Wege wählen. So und nun der Gegenweg, für 4 Byte mehr in deinem Movepacket. Client schickt den Move mit ID Server prüft ob er das Recht dazu hat die ID zu bewegen. Jeder Client der im Umkreis der ID ist bekommt das selbe Update, ID abc hat sich nach xy bewegt. |
generell,
es gibt 2 Wege 1. koords Dabei werden die Koords übertragen 2. Movement Dabei werden die laufbefehle übertragen und der Server passt die Posi an 100mb reichen locker für die paar Packete. Dein Vorgehen ist auch sehr gut für nen 2d game, mehr Aufwand würde sich nicht lohnen. ist sogar relativ schnell |
| All times are GMT +2. The time now is 09:07. |
Powered by vBulletin®
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.