Frage zu UDP Multiplayer ;)

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

denial

Betreff: Frage zu UDP Multiplayer ;)

BeitragSa, Aug 14, 2004 16:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Guten Tag Wink

Ich hab mich scho im Forum umgeguckt, hab aber eine solche Frage nicht gefunden... also stelle ich sie...
Ich will via UDP einen Multiplayermodus für mein Spiel machen - die Frage ist jetzt, wie ich die Pakete gestalte, die zwischen den Spielern ausgetauscht werden.

Wenn ich mal von einer etwas langsameren Verbindung ausgehe, die so pro Sekunde 5 kb schafft, ist das Senden der Daten doch etwas problematisch oder?
Solange ich bei etwa 60 FPS jedes Frame die X/Y Koordinaten der Spieler austausche, ist das noch in Ordnung... Aber es sollen noch viel mehr Informationen hinzukommen - und ich wollt wissen, welche Techniken es gibt, damit nicht zuviele Daten pro Sekunde gesendet werden? (Kompression, Nur in bestimmten Zeitintervallen senden etc.)

Gibt es Beispiele? Ich bin auf dem Gebiet Multiplayer recht neu Smile

Danke

Wild-Storm

BeitragSa, Aug 14, 2004 17:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Millisecs()
damit erfährst du die zeit die seit dem sys start von win vergangen ist
also z.b. if millisecs()-ms_old => 1000 then ;wenn länger als 1sec
dann sende daten als bytes (also mit writebyte stream,100) wenn es z.b. um leben geht oder so, die nich so hohe zahlen brauchen.
ansonsten kenne ich keine dollen techniken
Visit http://www.next-dimension.org
-------------------------------------------------
Freeware Modelle, Texturen & Sounds:
http://www.blitzforum.de/forum...hp?t=12875
 

denial

BeitragSa, Aug 14, 2004 17:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Mhmm hört sich gut an, klar.. wieso bin ich nich selbst draufgekommen...
Man kann ja die wichtigen Daten die zur Aktualisierung des Bildschirmes benötigt werden, jedes Frame senden (Koordinaten, Blickrichtung etc.)
Und die weniger wichtigen Daten im Sekundenabstand.

Danke dir, ich denke so bekommt man einen akzeptablen Datendurchsatz hin. Wünsch mir Glück Smile

Wild-Storm

BeitragSa, Aug 14, 2004 17:56
Antworten mit Zitat
Benutzer-Profile anzeigen
no problem^^
Visit http://www.next-dimension.org
-------------------------------------------------
Freeware Modelle, Texturen & Sounds:
http://www.blitzforum.de/forum...hp?t=12875
 

Gast

BeitragSo, Aug 15, 2004 14:47
Antworten mit Zitat
erstens: Genau überlegen, was du senden _musst_. Z.B. progge ich im Moment nen Pong Clone mit Multiplayer mode. erst hab ich für jedes Frame die Position des Balls gesendet. Jetzt hab ich das so umgestellt, dass Position und Geschwindigkeit übertragen werden und der Client selber den Ball bewegt solang nichts neues kommt. Damit muss man nur noch alle halbe Sekunde ein Paket zur Synchronisation rüberschicken. Effekt: Reduzierung der Datenrate auf 1/100 :-D

Also das Grundprinzip ist, nur das zu senden was der Client sich nicht selbst ausrechnen kann.

zweitens: komprimieren. Zahlen nicht in Strings umwandeln, sondern byteweise in den Stream schreiben (wie oben schon angedeutet). Nicht jede Zahl einzeln senden, sondern mehrere zusammenfassen (s.u. (1)).

drittens, Wenn du ein UDP-Paket schickst wird das in ein IP-Paket verpackt und das wieder in ein Ethernet-Paket. Dabei entstehen nochmal ca. 16 Bytes KOntrollcode, die "unnütz" Bandbreite fressen. Also lieber ein großes Paket schicken als viele kleine. (nicht immer einfach, da bin ich selbst noch am probieren).

btw, ich würd schon mit mindestens 10 kpbs rechnen, das sollte selbst ein Modem schaffen.

cu aurelian

(1) : Nehmen wir an du hast zwei WErte a und b die auf jeden Fall zwischen 0 und 999 liegen. Als Integers belegen sie 4 Byte, wenn du sie einfach hintereinander zusammen sendest also 8 Byte.
Jetzt gibts folgenden Trick:

Bilde c:=a+1000*b. Diese Zahl ist auf jeden Fall < 1 000 000 < 2^24.

Also ist c in 3 Bytes (24 Bit) unterzukriegen (c=$00xymnpq). Das geht folgendermaßen:

Writebyte stream, (c And $FF) ;schreibe $pq
Writebyte stream, ((c Shr 8) And $FF) ;schreibe $mn
Writebyte stream, (c Shr 16) And $FF) ;schreibe $xy
(Absenden :) )

das war die Codierung, auf CLientseite kannst du es folgendermaßen dekodieren:

(Empfangen)
c=0
c=ReadByte(stream)+(ReadByte(stream) Shl 8)+(ReadByte(stream) Shl 16) ; $pq+$mn00+$xy0000
(Jetzt hast du dein c wieder)

a=c Mod 1000
b=c / 1000 ;Nachkommastellen werden automatisch abgeschnitten
 

denial

BeitragSo, Aug 15, 2004 15:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke dir vielmals für deine Erläuterungen... Hat mir sehr geholfen... Smile
Ich werd damit jetz mal ein bisschen rumtesten.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group