UDP - scheint zu langsam...
Übersicht

Till P.Betreff: UDP - scheint zu langsam... |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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... ![]() 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 "[1] um das Spiel als Host zu starten." Print "[2] um das Spiel als Client zu starten." Print "[3] um das Spiel zu beenden." 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
Till P. |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke erstmal, hat mir schon weiter geholfen! ![]() Aber.... Es ist trotzdem viel zu langsam. ![]() 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 "[1] um das Spiel als Host zu starten." Print "[2] um das Spiel als Client zu starten." Print "[3] um das Spiel zu beenden." 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich hab mal ne Frage. Ist dieser Teil des Codes so komplett richtig und optimal?
Code: [AUSKLAPPEN] ;-----------------------------****
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." 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. ![]() (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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group