UDP - Speedproblem

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Puccini

Betreff: UDP - Speedproblem

BeitragSo, Jul 08, 2007 15:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!

Ich hab mir mal alle UDP-Tuts so angeschaut und hab auch gleich nen Multiplayer geprogt!

Mit 2 Spielern funtz das ganze wunderbar!

Host, Client kommunizieren super!
Nun mein Problem!

Wenn ein weitere Spieler beitritt,geht die Performenc dahin!
Dh, die Bewegungen kommen alle verzögert an! warum? aber so dermassen (ca2-3sec!)

Wie macht ihr das mit den Positionsdaten senden? sendet ihr die in jedem schleifendurchlauf oder nur zu bestimmten zeiten?? so alle 10ms?
Und ich habs so gemacht:
Der CLient meldet sich beim Host, bekommt die bestätigung und joint.
Der HOst sendet an alle Spieler das ein neuer da ist! (leider erscheint das nicht bei den anderen ???)
Der host empfängt alle daten der Spieler und verteilt sie auch gleich wieder an alle! auser an den ders geschickt hat.

wenn ihr code braucht sagt bescheid! aber vielleciht is das ja auch ein algemeiner fehelr und ich bin nur zu dumm! Rolling Eyes
-=Achtung=-
Suche Hobby-Modelliere der hin und wieder bock hat ein kleines Objekt zu erstellen. Bei Interesse PM
www.ragesoft.de
Passwortmanager: http://ragesoft.de/index.php?o...;Itemid=39

tft

BeitragSo, Jul 08, 2007 17:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi ...

machst du das über Lan . Oder über einen rechner?
TFT
https://www.sourcemagic.ch
Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!!

Puccini

BeitragSo, Jul 08, 2007 21:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Über WLAN-LAN (2 Rechner gehen über WLAN-Router und der 3. is mit kabel an den router angeshlossen!) wenn nur 2 zusammen spielen gehts ! sobald aber der 3. hinzu kommt geht nix mehr wirklich! ausserdem sehen sich die 2 spieler nicht!

hier der Host:

Code: [AUSKLAPPEN]
Function host()

      If RecvUDPMsg(stream_in)
         msgfrom=UDPMsgIP(stream_in)
                  If ReadLine(stream_in)="SEARCH"
                     WriteLine stream_out,"FOUND"
                     SendUDPMsg stream_out,msgfrom,7022
                  End If
      End If
      If RecvUDPMsg(stream)
         ;While
         msgtype=ReadByte(stream)
         msgfrom=UDPMsgIP(stream)
         msgport=UDPMsgPort(stream)
         Select (msgtype)
         Case 1                        ;neuer Spieler

            playername$=ReadString(stream)
            msg(playername$+" betritt das Spiel!")
            For p.player=Each player
               WriteByte(stream,1)
               WriteInt(stream,msgfrom)
               WriteString(stream,playername$)
               SendUDPMsg(stream,p\ip,p\port)
            Next
            p.player=New player
            p\ip=msgfrom
            p\port=msgport
            p\name$=playername$
            p\ping=MilliSecs()
            WriteByte(stream,3)               ;Bestätigung des Spielers
            WriteInt(stream,Host_IP)
            WriteString(stream,nickname$)      ;Nickname
            SendUDPMsg(stream,msgfrom,msgport)
            
         Case 2      ;Spielerdaten
               playerx=ReadInt(stream)
               playery=ReadInt(stream)
            For p.player=Each player
               If p\ip=msgfrom Then
                  p\x=playerx
                  p\y=playery
                  p\ping=MilliSecs()
               Else
                  WriteByte(stream,2)
                  WriteInt(stream,msgfrom)
                  WriteInt(stream,playerx)
                  WriteInt(stream,playery)
                  SendUDPMsg(stream,p\ip,p\port)
               End If

            Next
         End Select
         
      End If

      For p.player=Each player
         WriteByte(stream,2)
         WriteInt(stream,Host_IP)
         WriteInt(stream,x)
         WriteInt(stream,y)
         SendUDPMsg(stream,p\ip,p\port)
      Next
End Function


und hier der client:
Code: [AUSKLAPPEN]
Function client()
      If RecvUDPMsg(stream)
         msgtype=ReadByte(stream)

         Select (msgtype)
         Case 1      ;Neuer Spieler beigetreten
            IP=ReadInt(stream)
            playername$=ReadString(stream)
            msg(playername$+" betritt das Spiel!")
            p.player=New player
            p\ip=IP
            p\name$=playername$
         Case 2      ;Spielerdaten erhalten
            playerid=ReadInt(stream)
            For p.player=Each player
               If p\ip=playerid Then
                  p\x=ReadInt(stream)
                  p\y=ReadInt(stream)
                  p\ping=MilliSecs()
               End If
            Next

         End Select
         
      End If


         WriteByte(stream,2)
         WriteInt(stream,x)
         WriteInt(stream,y)
         SendUDPMsg(stream,Host_IP,host_port)

End Function


:< woran liegt das? ich seh nich was ich flasch mache! bin ich zu nahe am bildschirmoder was??
-=Achtung=-
Suche Hobby-Modelliere der hin und wieder bock hat ein kleines Objekt zu erstellen. Bei Interesse PM
www.ragesoft.de
Passwortmanager: http://ragesoft.de/index.php?o...;Itemid=39
 

Dreamora

BeitragMo, Jul 09, 2007 9:34
Antworten mit Zitat
Benutzer-Profile anzeigen
dein Host sieht höchst schräg aus sorry.

Du gehst 2x durch alle Player und sendest allen scheinbar alles.

Der Host sendet jedoch nur allen anderen Spielern (und die spieler unter einander senden garnichts)

Auch wenn der Spieler eine Nachricht erhält mit Positionen, liest du die Positionen aller Spieler aus, was auch viel zu viel ist.

Sende jede Nachricht einzeln! (das heisst für jeden Spieler eine einzelne Message das es ein Positionsupdate gab)

Dann sende nicht alle 0.1ms eine nachricht, damit stirbt dir Wireless auch nicht postwendend weg. Es gibt keine Netzverbindung die derart schnell wäre, es ist ausreichend, wenn du alle 5ms+ sendest, damit gibts immer noch 200 updates pro sekunde (also 3x soviele wie frames wenn du das einigermassen intelligent gelöst hast)
Den rest kannst bzw. musst du interpolieren!
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Puccini

BeitragMo, Jul 09, 2007 11:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Also,

ich mach das so:

jeder client schickt seine daten an den host. (MsgType 1)

Wenn der host das erhält, schickt er allen anderen Spielern die neuen Positionen des Spielers+ die Identität des Spielers (damit die wissen wer nun gerade sich bewegt hat!) und die daten des Spielers der gesendet hat, werden beim host auch aktuallisiert!

Am ende jeder schleife schickt der Host dann seine Daten an alle Spieler!
Ich wollt das nich so machen das jeder spieler jedem spieler seine daten schickt! das war mir dann doch zuviel traffic in meinen augen!

Dein Tip mit den alle 5ms senden find ich gut Very Happy werd ich woll so machen Wink danke!
-=Achtung=-
Suche Hobby-Modelliere der hin und wieder bock hat ein kleines Objekt zu erstellen. Bei Interesse PM
www.ragesoft.de
Passwortmanager: http://ragesoft.de/index.php?o...;Itemid=39
 

Dreamora

BeitragMo, Jul 09, 2007 11:06
Antworten mit Zitat
Benutzer-Profile anzeigen
hast natürlich recht ... hab im "rasch" drüberlesen was kleines übersehen. Wär schon recht sinnfrei gewesen alle auf einmal zu syncen Smile

Allerdings empfehle ich sehr das du "Empfangen" und "Senden" von daten trennst, also nicht erst schauen "kam was" und dann immer deine daten auch sendest sondern immer schauen ob was kommt, die sendefunktion aber nur alle X ms.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Puccini

BeitragDi, Jul 10, 2007 13:03
Antworten mit Zitat
Benutzer-Profile anzeigen
ich hab mir das jetzt so gedacht beim Host:

Code: [AUSKLAPPEN]
      If MilliSecs()-sendtime>5 Then
         For k.player=Each player
               For p.player=Each player
                  If k\ip<>p\ip Then
                     WriteByte(stream,2)      ;Spielerpositionen
                     WriteInt(stream,p\ip)
                     WriteInt(stream,p\x)
                     WriteInt(stream,p\y)
                     SendUDPMsg(stream,p\ip,p\port)
                  End If
               Next
         WriteByte(stream,2)         ;Host-Position
         WriteInt(stream,Host_IP)
         WriteInt(stream,x)
         WriteInt(stream,y)
         SendUDPMsg(stream,p\ip,p\port)
         Next
         sendtime=MilliSecs()
      End If


könnte das funktionnieren??
-=Achtung=-
Suche Hobby-Modelliere der hin und wieder bock hat ein kleines Objekt zu erstellen. Bei Interesse PM
www.ragesoft.de
Passwortmanager: http://ragesoft.de/index.php?o...;Itemid=39
 

Dreamora

BeitragDi, Jul 10, 2007 13:43
Antworten mit Zitat
Benutzer-Profile anzeigen
potentiell ja
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Puccini

BeitragDi, Jul 10, 2007 14:29
Antworten mit Zitat
Benutzer-Profile anzeigen
oki! ich werd das heute mal testen!

aber is es nich dumm 2mal alle spieler zu druchlaufen! wenn da jetzt 50 spieler dasind is das ne ganze menge! muss doch auch einfahcer gehen oder? -.-
-=Achtung=-
Suche Hobby-Modelliere der hin und wieder bock hat ein kleines Objekt zu erstellen. Bei Interesse PM
www.ragesoft.de
Passwortmanager: http://ragesoft.de/index.php?o...;Itemid=39
 

Dreamora

BeitragDi, Jul 10, 2007 14:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Muss es?
Net umbedingt, wenn alle von allen etwas wissen müssen leider zwangsweise eher nicht Smile
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Puccini

BeitragDi, Jul 10, 2007 14:41
Antworten mit Zitat
Benutzer-Profile anzeigen
eh wie jetzt?? ^^

es soll ja so sein das jeder spieler dem host seine position schickt! der erhält das, speichert die neuen werte und wenn 5ms um sind schickt er die kompletten daten aller spieler an alle spieler!

hmm...
-=Achtung=-
Suche Hobby-Modelliere der hin und wieder bock hat ein kleines Objekt zu erstellen. Bei Interesse PM
www.ragesoft.de
Passwortmanager: http://ragesoft.de/index.php?o...;Itemid=39
 

Dreamora

BeitragDi, Jul 10, 2007 15:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Jopp genau so.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group