Frage zu UDP Multiplayer ;)
Übersicht

denialBetreff: Frage zu UDP Multiplayer ;) |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Guten Tag ![]() 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 ![]() Danke |
||
![]() |
Wild-Storm |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() |
||
![]() |
Wild-Storm |
![]() Antworten mit Zitat ![]() |
---|---|---|
no problem^^ | ||
Visit http://www.next-dimension.org
------------------------------------------------- Freeware Modelle, Texturen & Sounds: http://www.blitzforum.de/forum...hp?t=12875 |
Gast |
![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke dir vielmals für deine Erläuterungen... Hat mir sehr geholfen... ![]() Ich werd damit jetz mal ein bisschen rumtesten. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group