UDP - scheint zu langsam...

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Till P.

Betreff: UDP - scheint zu langsam...

BeitragSo, Sep 25, 2005 11:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi Coder!

Ich bin gerade dabei ein sehr kleines netzwerkfähiges Pong zu programmieren.
Eigentlich ist das nur gedacht, um den Umgang mit Netzwerkbefehlen zu lernen. Ich hab mich dabei an das Tutorial von cyby angelehnt.
Ich bin gerade soweit, dass man sehen kann, wie der andere Spieler sein "Pad" bewegt, und hab das immer am eigenen Rechner getestet (ip 127.0.0.1).
nur ist das viel zu langsam. das pad wird beim anderen sehr verzögert dargestellt, was bei einem Pong Spiel nicht gerade günstig ist... Crying or Very sad

Hier der code:

Code: [AUSKLAPPEN]
Graphics 800,600,32,2
SetBuffer BackBuffer()
SeedRnd MilliSecs()
;HidePointer
MoveMouse 0,200

;Netzwerk
Global so,si,stream,ip,host_ip$

Type player
   Field im
   Field x,y,y2
   Field score
End Type
Global p1.player = New player
p1\x=5
p1\y=100
Global p2.player = New player
p2\x=785
p2\y=200

Type ball
   Field x#,y#
   Field xsp#,ysp#
End Type
Global b.ball = New ball
b\x=400
b\y=300
b\xsp=Rnd(-5,5)
b\ysp=Rnd(-5,5)


;Pads
For p.player = Each player
   p\im=CreateImage(1,60)
   SetBuffer ImageBuffer(p\im)
   Color Rand(100,255),Rand(100,255),Rand(100,255)
   Rect 0,0,1,60,1
   SetBuffer BackBuffer()
Next


;-----------------------------****
Print
Print "[1] um das Spiel als Host zu starten."
Print "[2] um das Spiel als Client zu starten."
Print "[3] um das Spiel zu beenden."
Print
wahl=Input("Ihre Wahl: ")
If wahl=1 Then
   so=8000
   si=8001
   stream=CreateUDPStream(si)
   If stream<>0 Then
      Print "Spiel als Host gestartet."
      Print "Warten auf Client...."
      Repeat
         ip=RecvUDPMsg(stream)
      Until ip<>0
      WriteByte stream,1
      SendUDPMsg stream,ip,so
    Else
      End
   EndIf

 ElseIf wahl=2
   host_ip=Input("IP des Hosts: ")
   ip=integerIP(host_ip)
   so=8001
   si=8000
   stream=CreateUDPStream(si)
   If stream<>0 Then
      WriteByte stream,1
      SendUDPMsg stream,ip,so
      Delay 1000
      If RecvUDPMsg(stream) Then
         empfangen=ReadByte(stream)
         If empfangen=1 Then
            Print "Spiel als Client gestartet."
         EndIf
       Else
         Print "Ende. Beliebige Taste drücken."
         WaitKey
         End
      EndIf
    Else
      End
   EndIf   

 Else
   End
EndIf





;######################################################################################################
While Not KeyHit(1)
Cls

steuerung()
update_ball()
draw_players()
draw_ball()

empfangen()

Color 255,255,0
Rect 0,10,800,1
Rect 0,589,800,1


Flip
Wend
Graphics 800,600,32,2
End
;######################################################################################################

Function steuerung()

   If KeyDown(200) Then
      If p1\y>10 Then p1\y=p1\y-5
      WriteInt stream,p1\y
      SendUDPMsg stream,ip,so
   ElseIf KeyDown(208) Then
      If p1\y<600-70 Then p1\y=p1\y+5
      WriteInt stream,p1\y
      SendUDPMsg stream,ip,so
   EndIf
   
;   p1\y=MouseY()
;   If MouseY()<10 Then MoveMouse 0,10
;   If MouseY()>600-70 Then MoveMouse 0,600-70
   
   If KeyHit(28) Then
      b\x=400
      b\y=300
   EndIf
End Function

;------------------------------------------------------------------------------------------------------

Function draw_players()
   
   For p.player = Each player
      DrawImage p\im,p\x,p\y
   Next
   
End Function

;------------------------------------------------------------------------------------------------------

Function draw_ball()

   Color 255,0,0
   Oval b\x,b\y,5,5
   
End Function

;------------------------------------------------------------------------------------------------------

Function update_ball()

   b\x=b\x+b\xsp
   b\y=b\y+b\ysp
   
   If b\y<=10+2.5 Or b\y>=590-7.5
      b\ysp=-b\ysp
   EndIf
   
   If b\x<=p1\x And b\x>=p1\x+b\xsp-3 Then
      If b\y+2.5 > p1\y  And  b\y+2.5 < p1\y+60 Then
         b\xsp=-(b\xsp*Rnd(.9,1.2))
         b\ysp=b\ysp*Rnd(.9,1.2)
      EndIf
   EndIf
   If b\x>=p2\x-5 And b\x<=p2\x+b\xsp+3 Then
      If b\y+2.5 > p2\y  And  b\y+2.5 < p2\y+60 Then
         b\xsp=-(b\xsp*Rnd(.9,1.2))
         b\ysp=b\ysp*Rnd(.9,1.2)
      EndIf
   EndIf
   
   If b\xsp>80 Then b\xsp=80
   If b\xsp<-80 Then b\xsp=-80
   If b\ysp>80 Then b\ysp=80
   If b\ysp<-80 Then b\ysp=-80
   
End Function

;------------------------------------------------------------------------------------------------------

Function IntegerIP(IP$)
 A1 = Int(Left(IP$,Instr(IP$,".")-1)) : IP$ = Right(IP$,Len(IP$)-Instr(IP$,"."))
 A2 = Int(Left(IP$,Instr(IP$,".")-1)) : IP$ = Right(IP$,Len(IP$)-Instr(IP$,"."))
 A3 = Int(Left(IP$,Instr(IP$,".")-1)) : IP$ = Right(IP$,Len(IP$)-Instr(IP$,"."))
 A4 = Int(IP$)
 Return (A1 Shl 24) + (A2 Shl 16) + (A3 Shl 8 ) + A4
End Function

;------------------------------------------------------------------------------------------------------

Function empfangen()

   If RecvUDPMsg(stream) Then
      
      p2\y=ReadInt(stream)
      
   EndIf

End Function

;------------------------------------------------------------------------------------------------------


Vielleicht weiß ja einer von euch was ich falsch gemacht hab!

Vielen Danke für jegliche Hilfe im Vorraus.

mfg
Till
 

BlackTermi

BeitragSo, Sep 25, 2005 12:37
Antworten mit Zitat
Benutzer-Profile anzeigen
mhh ich hab mir deinen code jetzt nicht angesehen weil ich gerade sehr beschäftigt bin, aber könnte es daran liegen das du entweder zu oft die daten sendest oder das du zu grosse variablen wie ints sendest,
bzw. vlt. beides machst...

Jolinah

BeitragSo, Sep 25, 2005 12:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Versuche mal die Daten weniger oft zu senden, du sendest sie ja wenn eine Pfeiltaste gedrückt ist. Hält man diese gedrückt wird also jedes Frame eine Message geschickt. Ich glaube das ist ein wenig viel. Alle 20-50 Millisekunden eine Message müsste auch schon reichen damit es für den Menschen ruckelfrei aussieht Wink
 

Till P.

BeitragSo, Sep 25, 2005 14:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke erstmal, hat mir schon weiter geholfen! Surprised

Aber....
Es ist trotzdem viel zu langsam. Confused ich hab es halt auf 30 fps begrenzt;
nur die pads alleine sind jetzt akzeptabel, aber als ich dann den ball hinzugefügt hab, fing es wieder an zu ruckeln... und die pads waren wieder stark verzögert.

Hier der Code:

Code: [AUSKLAPPEN]
Graphics 800,600,32,3
SetBuffer BackBuffer()
SeedRnd MilliSecs()
;HidePointer
MoveMouse 0,200

;Netzwerk
Global so,si,stream,ip,host_ip$="127.0.0.1",wahl

Type player
   Field im
   Field x,y,y2
   Field bewegen
   Field score
End Type
Global p1.player = New player
p1\x=5
p1\y=100
Global p2.player = New player
p2\x=785
p2\y=200

Type ball
   Field x#,y#
   Field xsp#,ysp#
End Type
Global b.ball = New ball
b\x=400
b\y=300
b\xsp=Rnd(-5,5)
b\ysp=Rnd(-5,5)


;Pads
For p.player = Each player
   p\im=CreateImage(1,60)
   SetBuffer ImageBuffer(p\im)
   Color Rand(100,255),Rand(100,255),Rand(100,255)
   Rect 0,0,1,60,1
   SetBuffer BackBuffer()
Next


;-----------------------------****
Print
Print "[1] um das Spiel als Host zu starten."
Print "[2] um das Spiel als Client zu starten."
Print "[3] um das Spiel zu beenden."
Print
wahl=Input("Ihre Wahl: ")
If wahl=1 Then
   so=8000
   si=8001
   stream=CreateUDPStream(si)
   If stream<>0 Then
      Print "Spiel als Host gestartet."
      Print "Warten auf Client...."
      Repeat
         ip=RecvUDPMsg(stream)
      Until ip<>0
      WriteByte stream,1
      SendUDPMsg stream,ip,so
    Else
      End
   EndIf

 ElseIf wahl=2
   ;host_ip=Input("IP des Hosts: ")
   ip=integerIP(host_ip)
   so=8001
   si=8000
   stream=CreateUDPStream(si)
   If stream<>0 Then
      WriteByte stream,1
      SendUDPMsg stream,ip,so
      Delay 1000
      If RecvUDPMsg(stream) Then
         empfangen=ReadByte(stream)
         If empfangen=1 Then
            Print "Spiel als Client gestartet."
         EndIf
       Else
         Print "Ende. Beliebige Taste drücken."
         WaitKey
         End
      EndIf
    Else
      End
   EndIf   

 Else
   End
EndIf



Global c
timer=CreateTimer(30)
;######################################################################################################
While Not KeyHit(1)
WaitTimer(timer)
c=c+1
Cls

steuerung()
update_ball()
draw_players()
draw_ball()

empfangen()

Color 255,255,0
Rect 0,10,800,1
Rect 0,589,800,1


Flip
Wend
Graphics 800,600,32,2
End
;######################################################################################################

Function steuerung()

   If KeyDown(200) Then
      If p1\y>10 Then p1\y=p1\y-5
      WriteByte stream,1
       WriteInt stream,p1\y
       SendUDPMsg stream,ip,so
         
    ElseIf KeyDown(208) Then
       If p1\y<600-70 Then p1\y=p1\y+5
      WriteByte stream,1
       WriteInt stream,p1\y
      SendUDPMsg stream,ip,so
   EndIf
   
;   p1\y=MouseY()
;   If MouseY()<10 Then MoveMouse 0,10
;   If MouseY()>600-70 Then MoveMouse 0,600-70
   
   If KeyHit(28) Then
      b\x=400
      b\y=300
   EndIf
End Function

;------------------------------------------------------------------------------------------------------

Function draw_players()
   
   For p.player = Each player
      DrawImage p\im,p\x,p\y
   Next
   
End Function

;------------------------------------------------------------------------------------------------------

Function draw_ball()

   Color 255,0,0
   Oval b\x,b\y,5,5
   
End Function

;------------------------------------------------------------------------------------------------------

Function update_ball()

   If wahl=1 Then
      
      If b\y<=10+2.5 Or b\y>=590-7.5
         b\ysp=-b\ysp
      EndIf
      
      If b\x<=p1\x And b\x>=p1\x+b\xsp-3 Then
         If b\y+2.5 > p1\y  And  b\y+2.5 < p1\y+60 Then
            b\xsp=-(b\xsp*Rnd(.9,1.2))
            b\ysp=b\ysp*Rnd(.9,1.2)
         EndIf
      EndIf
      If b\x>=p2\x-5 And b\x<=p2\x+b\xsp+3 Then
         If b\y+2.5 > p2\y  And  b\y+2.5 < p2\y+60 Then
            b\xsp=-(b\xsp*Rnd(.9,1.2))
            b\ysp=b\ysp*Rnd(.9,1.2)
         EndIf
      EndIf
      
      If b\xsp>80 Then b\xsp=80
      If b\xsp<-80 Then b\xsp=-80
      If b\ysp>80 Then b\ysp=80
      If b\ysp<-80 Then b\ysp=-80
   
   

      b\x=b\x+b\xsp
      b\y=b\y+b\ysp
      
      If c Mod 2 = 0 Then
         WriteByte stream,2
         WriteInt stream,b\x
         WriteInt stream,b\y
         SendUDPMsg stream,ip,so
      EndIf
      
      
   ElseIf wahl=2
;      b\x=b\x-b\xsp
;      b\y=b\y+b\ysp
   EndIf   
      
End Function

;------------------------------------------------------------------------------------------------------

Function IntegerIP(IP$)
 A1 = Int(Left(IP$,Instr(IP$,".")-1)) : IP$ = Right(IP$,Len(IP$)-Instr(IP$,"."))
 A2 = Int(Left(IP$,Instr(IP$,".")-1)) : IP$ = Right(IP$,Len(IP$)-Instr(IP$,"."))
 A3 = Int(Left(IP$,Instr(IP$,".")-1)) : IP$ = Right(IP$,Len(IP$)-Instr(IP$,"."))
 A4 = Int(IP$)
 Return (A1 Shl 24) + (A2 Shl 16) + (A3 Shl 8 ) + A4
End Function

;------------------------------------------------------------------------------------------------------

Function empfangen()

   If RecvUDPMsg(stream) Then
      
      Select ReadByte(stream)
         Case 1
            p2\y=ReadInt(stream)
         Case 2
            If wahl=2 Then
               b\x=ReadInt(stream)
               b\y=ReadInt(stream)
            EndIf
      End Select
       
   EndIf

End Function

;------------------------------------------------------------------------------------------------------
 

BlackTermi

BeitragSo, Sep 25, 2005 15:01
Antworten mit Zitat
Benutzer-Profile anzeigen
hmm, sind die zahlen der x/y pos denn so groß das du dafür unbedint integers brauchst?
du könntest doch auch short nehmen, das macht das ganze schon wieder ein bisschen schneller...


und warum nimmst du eigentlich types? du könntest doch auch dims nehmen, die sind wieder ein bisschen schneller...

.:BotC:. Pascal

BeitragMi, Okt 05, 2005 22:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab mal ne Frage. Ist dieser Teil des Codes so komplett richtig und optimal?

Code: [AUSKLAPPEN]
;-----------------------------****
Print
Print "[1] um das Spiel als Host zu starten."
Print "[2] um das Spiel als Client zu starten."
Print "[3] um das Spiel zu beenden."
Print
wahl=Input("Ihre Wahl: ")
If wahl=1 Then
   so=8000
   si=8001
   stream=CreateUDPStream(si)
   If stream<>0 Then
      Print "Spiel als Host gestartet."
      Print "Warten auf Client...."
      Repeat
         ip=RecvUDPMsg(stream)
      Until ip<>0
      WriteByte stream,1
      SendUDPMsg stream,ip,so
    Else
      End
   EndIf

 ElseIf wahl=2
   ;host_ip=Input("IP des Hosts: ")
   ip=integerIP(host_ip)
   so=8001
   si=8000
   stream=CreateUDPStream(si)
   If stream<>0 Then
      WriteByte stream,1
      SendUDPMsg stream,ip,so
      Delay 1000
      If RecvUDPMsg(stream) Then
         empfangen=ReadByte(stream)
         If empfangen=1 Then
            Print "Spiel als Client gestartet."
         EndIf
       Else
         Print "Ende. Beliebige Taste drücken."
         WaitKey
         End
      EndIf
    Else
      End
   EndIf   

 Else
   End
EndIf



Denn ich will jetzt endlich mal UDP kapieren und hab mir dabei zufällig diesen Code als Vorlage zum lernen rausgepickt. Ich kam bisher immer mit diesen ganzen Streams und Ports durcheinander (ist meiner Meinung nach auch in Robs BB Kurs nicht sehr gut erklärt).
Naja, ich versuche jetzt gerade dieses Zeug zu kapieren, aber bei Robs BB Kurs steht irgendwo, man müsste einen Sende- und einen Empfangsstream erstellen, aber in diesem Code sehe ich nur einen Stream, aber zwei Ports.
Ich hoffe ich bin nicht der Einzige, der UDP so verwirrend findet. Embarassed

(Edit: Ich glaub ich hab UDP jetzt endlich richtig kapiert. Auch das mit den Streams. Ist gar nicht so schwer, wie ich immer dachte.)
Repeat

Print "Uuuuh und das ist der Beweis, immer das selbe, alles dreht sich im Kreis."

Forever

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group