UDP Ein großes Datenpaket oder mehrere kleine.

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

bloxx01

Betreff: UDP Ein großes Datenpaket oder mehrere kleine.

BeitragMo, Feb 07, 2005 22:11
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Feb 07, 2005 22:22
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink

bloxx01

BeitragMo, Feb 07, 2005 22:29
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Feb 07, 2005 22:31
Antworten mit Zitat
Benutzer-Profile anzeigen
bei nem großen paket hast du das problem, das, wenn es wirklich mal verloren geht, alles nicht ankommt.
 

BIG BUG

BeitragMo, Feb 07, 2005 22:32
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Feb 07, 2005 22:35
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Feb 07, 2005 22:53
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink
Space Threat - der kostenlose 3D Multiplayer Spaceshooter
www.SpaceThreat.de
 

morszeck

BeitragDi, Feb 08, 2005 18:56
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Feb 08, 2005 19:27
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Feb 08, 2005 19:42
Antworten mit Zitat
Benutzer-Profile anzeigen
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()

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group