Ich arbeite derzeit an einem Online-Multiplayer-Spiel in Echtzeit. Ziel ist eine Client / Server-basierte Verbindung mit dem UDP-Protokoll. Bisher habe ich UDP für Spielerbewegungen und TCP für Ereignisse verwendet (ein Spieler schießt, ein Spieler verliert das Leben), weil ich sicher sein muss, dass solche Daten bei allen mit dem Server verbundenen Spielern ankommen. Ich weiß, dass UDP als "unzuverlässig" bezeichnet wird und einige Pakete verloren gehen können. Aber ich habe überall gelesen, niemals TCP und UDP zu mischen, da dies die Verbindung beeinträchtigen kann.
Die Hauptfrage ist, wie ich mein Netzwerk organisieren soll.
UDP ist verbindungslos. Wie soll ich speichern, wer wer ist? Soll ich IP-Adressen der Kunden in einer Liste speichern?
Soll ich TCP für wichtige Ereignisse oder UDP verwenden? Wie kann ich sicherstellen, dass keine Daten verloren gehen, wenn ich UDP verwenden muss?
Wenn ich sowohl TCP als auch UDP verwende, muss ich für jeden Spieler seine IP in einer Liste (für UDP) und den TcpClient speichern, der in einer anderen Liste (für UDP) verbunden ist. Wie könnte ich das ändern, um effektiver zu sein?
quelle
Antworten:
UDP hat weniger Overhead, aber auf Kosten des Verlusts von Paketen, ohne es zu wissen (ein Teil des Overheads mit TCP stellt sicher, dass verlorene Pakete erneut gesendet werden).
Das große Problem bei der Verwendung von UDP ist jedoch, dass es viele Sites gibt, die den gesamten UDP-Verkehr blockieren (außer DNS), da viele Administratoren der Meinung sind, dass dies eine gute Sicherheitspraxis ist.
Gehen Sie auch nicht davon aus, dass jeder Ihrer Spieler eine andere IP-Adresse hat - es gibt viele Situationen, in denen mehrere Benutzer dieselbe Internetverbindung nutzen, und wenn Schulkinder von Ihrem Spiel begeistert sind, können Sie darauf wetten, dass sie es wahrscheinlich sind Sie werden herausfinden, wie Sie es während des Unterrichts installieren und ausführen können, anstatt ihre Arbeit zu erledigen (und möchten Sie nicht lieber, dass sie diese kostbare Zeit für Ihr Spiel verbringen, anstatt für die eines anderen?).
Sobald Ihr TCP-Stream geöffnet ist, ist er immer noch ziemlich effizient. Der nächste Schritt besteht darin, die Datenmenge, die Sie senden / empfangen, zu minimieren. Hier kommt das Protokolldesign ins Spiel. Wenn Sie nur ein paar Bytes für jeden Befehl senden (z. B. "vorwärts gehen"), anstatt beispielsweise denselben Befehl in Hunderte von Bytes XML-Code zu verpacken, ist Ihr Gesamtverbrauch an Netzwerkbandbreite geringer UND weniger CPU-Zyklen erforderlich sein, um die Informationen zu verarbeiten (einige Bytes können leicht mit dem Zerlegen und Interpretieren und Syntaxprüfen eines großen Teils von XML verglichen werden).
Sie können sicherlich mehrere TCP-Streams öffnen und für verschiedene Zwecke verwenden, z. B. einen für Befehle, einen für Grafikübertragungen, einen für audio-basierten Chat usw. Auf diese Weise, wenn Sie eine große Grafik übertragen, die 5 bis 10 dauert Sekunden nach dem Herunterladen werden zumindest die Befehlsbewegungen der Spieler nicht verzögert, da sie sich in einem anderen Stream befinden (und Sie können ein Standard-Sprite anzeigen, bis das neue Sprite heruntergeladen ist, was immer mehr Spaß macht als zu warten).
quelle
Dies ist keine direkte Antwort auf Ihre Frage, aber gafferongames hat einige wirklich schöne Artikel über Netzwerkspiele: http://gafferongames.com/networking-for-game-programmers/what-every-programmer-needs-to-know-about -game-networking /
quelle