UDP Ein großes Datenpaket oder mehrere kleine.
Übersicht

![]() |
bloxx01Betreff: UDP Ein großes Datenpaket oder mehrere kleine. |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich habe mal eine kleine Frage:
Würde es Performance kosten wenn man mehrere kleine Datenpakete via UDP versendet anstatt ein großes? Ich komme im Moment bei meinem Multiplayer Spaceshooter nicht bei der Ki weiter, da es zu viel Performance kostet die Positionen von ~ 100 Gegnern dauerhaft mehrmals in der Sekunde an alle Clienten zu senden. Wie würdet ihr dieses Problem lösen? Und was ist sinnvoller, ein großes Datenpaket was alle Daten wie Gegnerinfos,Laserinfos,Positionen enthält oder das ich diese Infos in verschiedenen Paketen versende wie jetzt im Moment? |
||
Space Threat - der kostenlose 3D Multiplayer Spaceshooter
www.SpaceThreat.de |
Sebe |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Du aktualisierst jeweils nur das was notwendig ist. Z.b. gibt der Client dem Server die Koordinaten und der Server schickt eben nur die Infos zu den Gegnern, die in einem bestimmten Umkreis sind ![]() |
||
![]() |
bloxx01 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Stimmt, das kann ich auch sehr einfach realisieren, da die komplette 3D Szene auf dem Server bereits nachgestellt wird (Ohne RenderWorld) somit kann der Server auch berechnen wem er die Gegnerdaten schicken soll. Aber was bringt nun mehr: Jedes Schiff wird in einem eigenen Datenpaket versendet, oder ein einziges großes für alle Schiffe? | ||
Space Threat - der kostenlose 3D Multiplayer Spaceshooter
www.SpaceThreat.de |
konstantin |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
bei nem großen paket hast du das problem, das, wenn es wirklich mal verloren geht, alles nicht ankommt. | ||
BIG BUG |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Anstatt die Positionen aller KI-Piloten zu übertragen könntest du auch nur die Spieler jeweils komplett synchronisieren und darauf hin die KI selbst rechnen lassen(Zufällige KI-Aktionen müssen natürlich auch synchronisiert werden).
So kannst Du jede Menge Netzlast einsparen, allerdings ist es sehr schwierig so ein "Gebilde" auf jedem Rechner synchron laufen zu lassen. |
||
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final) |
![]() |
wunderkind |
![]() Antworten mit Zitat ![]() |
---|---|---|
Alu hat Folgendes geschrieben: bei nem großen paket hast du das problem, das, wenn es wirklich mal verloren geht, alles nicht ankommt.
Dann muss ebend dafür gesorgt werden, dass alle wichtigen Pakete ankommen! Die einfachste Kontrolle wäre eine Durchnummerierung. Fehlt ein Paket, wird es erneut angefordet, solange bis es erfolgreich übertragen wurde. |
||
![]() |
bloxx01 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich werde es warscheinlich bei begrenzter Übertragungsreichweite lassen:
If entitydistance(spieler,ki) < wert then keine Übertragung. Das spart Netzauslastung und es ist leicht zu schaffen. Es gibt bald eine kleine Beta zum testen ![]() |
||
Space Threat - der kostenlose 3D Multiplayer Spaceshooter
www.SpaceThreat.de |
morszeck |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Erstelle ein string$ der max 1800 Zeichen lang ist und spätestens in einem gewissen Zeitinterval gesendet wird.
In etwa so ist das Grundprinzip: Code: [AUSKLAPPEN] Spieler_anzahl = 10 Spieler_x[0] = ... Spieler_y[0] = ... Spieler_live[0] = ... Spieler_x[1] = ... Spieler_y[1] = ... Spieler_live[1] = ... .... weitere spieler .... while ... send_status() .... dein GAME .... wend end function send_status() max_length = 1000 max_timeout = 50 ; ms time_s = millisecs() msg$ = "" for i=1 to Spieler_anzahl time_d = millisecs() - time_s if len(msg$) > max_length OR time_d > max_time_out then ... per UDP msg$ senden .... time_s = millisecs() msg$ = "" endif msg$ = msg$ +";"+ Spieler_x[i] msg$ = msg$ +";"+ Spieler_y[i] msg$ = msg$ +";"+ Spieler_live[i] next if len(msg$) > 0 then ... per UDP msg$ senden .... end function |
||
![]() |
Vertex |
![]() Antworten mit Zitat ![]() |
---|---|---|
Generell darf ein Packet max. 65536 Byte groß sein. Da Blitz eine hohe Performenceverschwendung mit zwischen Speichern verpraktiziert, lohnt es sich, größe Datenpackete mit Banks zu verschicken. Nachteil ist natürlich wie gesagt wurden, die höhere Fehleranfälligkeit. Prüfen kann man UDP Packete z. B. CRC Check. Da kann man sich irgendwas einfallen lassen.
mfg olli |
||
vertex.dreamfall.at | GitHub |
morszeck |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
in dem Fall:
Code: [AUSKLAPPEN] Spieler_anzahl = 10
Spieler_x[0] = ... Spieler_y[0] = ... Spieler_live[0] = ... Spieler_x[1] = ... Spieler_y[1] = ... Spieler_live[1] = ... .... weitere spieler .... while ... send_status() .... dein GAME .... wend end function send_status() max_length = 65000 max_timeout = 50 ; ms time_s = millisecs() msg$ = "" for i=1 to Spieler_anzahl time_d = millisecs() - time_s if len(msg$) > max_length OR time_d > max_time_out then crc = 0 ; pseudo CRC for j=1 to len(msg$) crc = crc XOR asc( mid$(msg$,j,1) ) next msg$ = string$(crc) +";"+ msg$ ... per UDP msg$ senden .... time_s = millisecs() msg$ = "" endif msg$ = msg$ +";"+ Spieler_x[i] msg$ = msg$ +";"+ Spieler_y[i] msg$ = msg$ +";"+ Spieler_live[i] next if len(msg$) > 0 then crc = 0 ; pseudo CRC for j=1 to len(msg$) crc = crc XOR asc( mid$(msg$,j,1) ) next ... per UDP msg$ senden .... endif end function HIER NOCH EIN TEST ... für den Speed: Code: [AUSKLAPPEN] player = 100 ; anzahl spieler
player_var = 10 ; anzahl INT datenblöcke wie x- y-position byte = 4 + 1 ; grösse eines bytes und trennzeichen ; total = player * player_var * byte ; total bytes For t = 0 To 10 txt$ = "" For x=0 To total txt$ = txt$ + Rand(32,255) Next ts = MilliSecs() For i=1 To Len(txt$) crc = crc + Asc(Mid$(txt$,i,1)) Next Print MilliSecs() - ts +" ms" Print crc Next WaitKey() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group