Sprache: C ++
Meine Frage lautet wie folgt: Ich möchte wissen, was der beste oder zumindest beste Weg ist, um Daten vom Client zum Server zu packen und zu senden und umgekehrt. Es wird einige Daten geben, die ein einzelnes Paket bilden. Ein Paket hat eine "ID", die definiert, wofür es ist, und dann die Daten in einer festgelegten Reihenfolge für die "Aktion", der das Paket entspricht.
Für weniger leistungsabhängige Systeme würde ich nur Zeichenfolgen senden, die durch ein Leerzeichen getrennt sind. Dies sind die Daten der "Aktion" und das erste "Wort" der Paketkennung und die Verkettung von Anweisungen, die prüfen, ob eine Übereinstimmung vorliegt .
Für ein kritischeres System war das, was ich bisher gelernt habe, ungefähr so:
Erstellen Sie eine Zeichenfolge mit Paket-ID und Daten und senden Sie diese. Zum Entpacken könnte ich dann die erste Ganzzahl in der Zeichenfolge extrahieren und ein Array von Paket-Handlern mit Indizes haben, die der Paket-ID entsprechen, die sie verarbeiten, und einfach so etwas wie packetHandlers [packetID] .Process (packetData) tun.
Was denkst du darüber, irgendwelche Vorschläge? sehr geschätzt!
quelle
Warum zwei verschiedene Codierungsschemata verwenden? Verwenden Sie einfach die zweite für jedes System. Halte es einfach.
Erwägen Sie die Verwendung der Delta-Komprimierung. Dh einen vollen Wert senden und danach nur noch die Dinge, die sich geändert haben. Nach einigen Spieliterationen wird wieder ein voller Wert gesendet.
Eine andere Kodierung, die Sie in Betracht ziehen könnten, ist Base 128 Varint. Google Protobufs verwenden es. Werfen Sie einen Blick auf die Seite "Codierung" des Entwicklerhandbuchs: Protokollpuffer-Codierung Könnte einige Bytes sparen.
quelle
Was könnte ein Beispiel für die Daten sein, die Sie senden? Ich sehe keinen Grund, etwas übermäßig Phantasievolles zu tun. Sobald die Daten vollständig in den Puffer des Empfängers geladen sind, überprüfen Sie die erste
int
anhand ihres Werts. Anschließend wissen Sie, wie Sie den Rest der Daten verarbeiten.So ein Paket , das vier Datenteile aufweist
id
,val1
,val2
undval2
könnte wie folgt aussehen:Wenn Sie das erste Byte lesen (von dem Sie wissen, dass es immer vorhanden ist), entscheiden Sie, wie der nächste Datensatz verarbeitet werden soll. Wenn das erste Wort (ID) ist
00000001
, wissen Sie, dass drei weitere Wörter folgen, und das ist das Ende des Pakets. Um das Beispiel fortzusetzen, könnte man id = hat00000010
und Ihre Spezifikation besagt, dass für id - Wert 2, Sie verarbeitenfloat
,float
,float
in dieser Reihenfolge, die eine Spielerposition im Welt - Raum angeben könnte.Stellen Sie sich vor, Sie schreiben Ihr eigenes binäres Dateisystem. Sie haben einen Header-Wert, der den Rest der Daten beschreibt, wo sie sich befinden (welche Position) und als welche Art von Daten sie behandelt werden sollen.
quelle