UDP Problem, langsam ankommende Verbindung *gelöst*

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

GearTechDE

ehemals 'KillerJo96'

Betreff: UDP Problem, langsam ankommende Verbindung *gelöst*

BeitragFr, Dez 02, 2011 15:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
ich habe mir endlich mal einen Ruck gegeben und mich wirklich sehr intensiv mit UDP beschäftigt. Da ich dieses Netzwerk Protokoll irgendwie nie verstanden hatte, fehlten in meinen Spielen immer die passenden Funktionen wie z.B. ein Multiplayer Modus etc. An einem Tag hatte ich einfach, irgendwas, was mir irgendwie den Mut verschafft hat, dass ich UDP auf Anhieb verstanden habe. Kurz darauf (ca. 10 min nach dem ich mir ein Tutorial angeschaut habe) habe ich einen kompletten Chat in UDP geschrieben ohne Fehler und alles. Seiddem kann ich UDP Very Happy

Naja zu meinem Problem:

Ich habe es auch endlich geschafft das Grundgerüst einen Multiplayer Games zu programmieren, also mit Types jeden Client anlegen und dafür erstmal würfel erstellen lassen etc. jetzt lasse ich die koordinaten nur übertragen, wenn eine der bewegungstasten W,A,S oder D gedrückt wird. Ich hab mir gedacht das sonst unnötiger Traffic ansteht. Jedoch nach neuen nachrichten prüfe ich sofort in der Hauptschleife ohne eine bremse so zu sagen, das also jeden schleifendurchlauf geprüft wird ob eine neue UDP nachricht da ist... Trotz vielem nachdenken wie ich es besser machen könnte, hab ich trotzdem das problem, dass die übertragung wirklich sehr langsam von statte geht. wenn ich es über das internet mache, dauert es bestimmt 2-3 sekunden, bis der andere würfel sich bewegt. warum ist das so? kann ich das irgendwie beschleunigen?

Ich hoffe jemand kennt ein paar antworten auf mein problem

PS: Ich habe eine 13.000 er Leitung und aufm andren PC auch. sollte also eig. nicht daran liegen oder?
Mit freundlichen Grüßen: GearTechDE
  • Zuletzt bearbeitet von GearTechDE am Fr, Dez 02, 2011 18:37, insgesamt einmal bearbeitet

ZEVS

BeitragFr, Dez 02, 2011 16:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Code ist eine feine Sache, wenn du gezielte Hilfe haben willst.
Bei 13000 bits/sec sollte ein Byte eingentlich wie nichts durchflutschen.

ZEVS

GearTechDE

ehemals 'KillerJo96'

BeitragFr, Dez 02, 2011 16:29
Antworten mit Zitat
Benutzer-Profile anzeigen
hmm... ja das ist so ne sache.. ich weiß nie welchen teil ich am besten poste, und den ganzen teil wäre zu aufwändig, es sind mehrere includes und es wäre wahrscheinlich zu kompliziert
Mit freundlichen Grüßen: GearTechDE

aMul

Sieger des Minimalist Compo 01/13

BeitragFr, Dez 02, 2011 16:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Könntest du probieren, ein sehr einfaches Programm zu schreiben, in welchem der "Fehler" auch auftritt?
Vielleicht ein simples Programm was sich mit einer anderen Intanz verbinden kann und beide je ein kleines Rechteck oder so bewegen können?

Wenn es auch bei so etwas einfachem eine große Verzögerung gibt ließe sich dort das Problem unter Umständen deutlich einfacher finden.
(Wenn es denn ein Code-technisches Problem ist.)
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver

ZEVS

BeitragFr, Dez 02, 2011 16:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Moment mal...
Jeder Client besteht aus einem Würfel. Er meldet sich beim Server an, schickt seine Koordinaten, zeigt die anderen Clients an und passt auf, dass alle Pakete einmal ankommen. Ich stelle es mir schwierig vor, hier auf mehrere Dateien zu kommen, es seie denn, du hast eine Abneigung gegen Dateien mit mehr als 300 Zeilen. Aber auch dann kannst du die Includes für das Posten durch die Dateien ersetzen.
Wenn du dir (was sehr sinnvoll ist) die Netzwerkfunktionen ausgelagert hast, dann reicht es diese zu posten. Gehe aber bitte sicher, dass der Fehler nicht außerhalb liegt (einfach DebugLog in die wichtigen Funktionen um sicherzustellen, dass diese aufgerufen werden).

ZEVS

ToeB

BeitragFr, Dez 02, 2011 16:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Also das ist ein Fehler der immer wieder auftritt. Und zwar, rufst du wahrscheinlich die RecvUDPMsg Funktion nur einmal pro Schleifendurchgang auf. Du müsstest aber in einem Schleifendurchgang ALLE Nachrichten für diesen Durchgang lesen - Also mit ner While-Schleife davor prüfen, ob eine Nachricht gekommen ist oder nicht:

BlitzBasic: [AUSKLAPPEN]
While RecvUDPMsg( )
byte = ReadByte( )
Wend


Und das jeden Schleifendurchgang.
Denn Blitz speichert die empfangenen Daten in einer Liste zwischen, welche nach und nach ab gearbeitet wird. da die Programm NIE 100% Synchron laufen und auch noch sende-Zeit dazwischen liegt, sind die Nachrichten oft "im Verzug", also die Liste wird immer Länger.

Lg
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

GearTechDE

ehemals 'KillerJo96'

BeitragFr, Dez 02, 2011 16:54
Antworten mit Zitat
Benutzer-Profile anzeigen
ich kriege ja alle pakete, es ist ja nicht das problem das welche verloren gehen... (glaub ich) das problem ist einfach, dass alle nachrichten viel zu spät ankommen... in der Haupschleife hab ich ne funktion UpdateNetwork().

Darin steht:

If RecvUDPMsg(UDPStream) <> 0 Then

Select Readbyte(UDPStream)

Case Join

etc..

end select

End If

Ich dachte, dass es so ist, dass ich den pc zu sehr damit belaste jeden schleifendurchlauf nach nachrichten zu gucken. aber das kann wenn ich mal so drüber nach denke auch nicht sein-.- vielleich t sende ich einfach zu viel..

BlitzBasic: [AUSKLAPPEN]

If KeyDown(KEY_W) Then

MoveEntity Character,0,0,0.05
WriteByte(UDPSTream,Coordinates)
WriteFloat(UDPStream,X)
WriteFloat(UDPSTream,Y)
etc.

End If


ist das vielleicht zu viel. weil auch dann wird jja ständig gesendet und das jeden schleifen durchlauf
Mit freundlichen Grüßen: GearTechDE

ToeB

BeitragFr, Dez 02, 2011 16:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Siehe oben Wink

Lg
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

GearTechDE

ehemals 'KillerJo96'

BeitragFr, Dez 02, 2011 17:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Siehe oben


hä?? ich habe habe doch das RecvUDPMsg in der hauptschleife? kann man 2 hauptschleifen machen oder was?
Mit freundlichen Grüßen: GearTechDE

ZEVS

BeitragFr, Dez 02, 2011 17:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Man kann eine While-Schleife in der Hauptschleife verwenden.

ZEVS

GearTechDE

ehemals 'KillerJo96'

BeitragFr, Dez 02, 2011 17:09
Antworten mit Zitat
Benutzer-Profile anzeigen
ach und dann soll ich jetzt die Funktion UpdateNetwork die in der eigentlichen hauptschleife ist noch in die while schleife machen? in etwa so?

BlitzBasic: [AUSKLAPPEN]


Repeat

While Not KeyHit(1)

UpdateNetwork()

Wend


Until KeyHit(1)
End
etc.

Mit freundlichen Grüßen: GearTechDE

ToeB

BeitragFr, Dez 02, 2011 17:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Das hast du wieder was falsch verstanden Very Happy

Du sollst nur die Nachrichten abfrage in der Hauptschleife in eine Schleife setzten :
BlitzBasic: [AUSKLAPPEN]
Repeat ;Hauptschleife

While RecvUDPMsg() ;Empfangs-Schleife
byte = ReadByte( )
Wend

Until Bla


Das heißt, die While-Schleife läuft solange, bis keine Nachricht mehr da ist. Danach geht die Hauptschleife weiter.

Lg
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Propellator

BeitragFr, Dez 02, 2011 18:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Würde aber im Prinzip keinen Lag von 2-3 Sekunden auslösen, ausser sein Spiel läuft mit etwa einem FPS.

Meine Vermutung ist, dass du jeden Schleifendurchlauf Daten reinschaufelst. Es wäre auch gut zu wissen wie viele Daten es sind, und ob du einen Timer hast.

MfG

Zitat:
Bei 13000 bits/sec sollte ein Byte eingentlich wie nichts durchflutschen.

Auch wenn ich vermute dass du dies nicht so gemeint hast, ist es eine gefährliche Aussage. Dies gibt die Bandbreite an, nicht die Geschwindigkeit. Und 13'000 bit/s sind ziemlich wenig, meinst du nicht etwa 13'000kBit/s bzw. 13 MBit/s?
Propellator - Alles andere ist irrelephant.
Elefanten sind die Könige der Antarktis.

ZEVS

BeitragFr, Dez 02, 2011 18:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Embarassed OK, ich kenne mich mit diesen Termini nicht aus. Fest steht auf jeden Fall, dass bei jeder üblichen Bandbreite (wie du sie genannt hast) ein Byte schnell durchkommt.

ZEVS

Propellator

BeitragFr, Dez 02, 2011 18:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Ein Byte kommt im Prinzip immer gleich schnell durch, sofern die Bandbreite grösser als der Paket-Header plus das eine Byte als Inhalt ist.
Eine Internetanbindung mit einer höheren Bandbreite heisst nur, dass du mehr Bytes gleichzeitig reinschaufeln kannst, jedoch wird ein einzelnes Byte immer gleich schnell ankommen.
Man könnte so ein Vergleich machen mit einer Röhre; je grösser der Durchmesser, desto mehr Wasser kannst du hineinschütten, aber der einzelne Wassertropfen wird nicht schneller wenn das Rohr grösser ist.

MfG
Propellator - Alles andere ist irrelephant.
Elefanten sind die Könige der Antarktis.

GearTechDE

ehemals 'KillerJo96'

BeitragFr, Dez 02, 2011 18:28
Antworten mit Zitat
Benutzer-Profile anzeigen
kann ich es auch so machen?

BlitzBasic: [AUSKLAPPEN]


While RecvUDPMsg(UDPStream) <> 0

UpdateNetwork()

Wend



und in UpdateNetwork steht:

BlitzBasic: [AUSKLAPPEN]

Function UpdateNetwork()

Select ReadByte(UDPStream)

Case 1 ;New Client

;Auslesen
ID% = ReadInt(UDPStream)
Name$ = ReadString(UDPStream)

;Eintragen
c.Client = New Client
c\ID = ID
c\Name = Name
c\Mesh = CreateCube()
EntityColor c\Mesh,255,0,0

Case 2 ;Del. Client

;Auslesen
ID% = ReadInt(UDPStream)

;Client suchen
For c.Client = Each Client

If c\ID = ID Then

FreeEntity c\Mesh
Delete c

End If

Next

Case 3 ;Coordinates

;Auslesen
ID% = ReadInt(UDPStream)
X# = ReadFloat(UDPStream)
Y# = ReadFloat(UDPStream)
Z# = ReadFloat(UDPStream)
Yaw# = ReadFloat(UDPStream)

;Eintragen der Infos
For oc.Client = Each Client

If oc\ID = ID Then

PositionEntity oc\Mesh,X,Y,Z
RotateEntity oc\Mesh,EntityPitch(oc\Mesh),Yaw,EntityRoll(oc\Mesh)

End If

Next

End Select

End Function


ist das so richtig?
Mit freundlichen Grüßen: GearTechDE

Propellator

BeitragFr, Dez 02, 2011 18:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Hast du einen Timer ( CreateTimer WaitTimer ) im Programm?
Propellator - Alles andere ist irrelephant.
Elefanten sind die Könige der Antarktis.

GearTechDE

ehemals 'KillerJo96'

BeitragFr, Dez 02, 2011 18:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja hab ich, und ehm ja ich hab es schon hinbekommen es funktioniert jetzt. Danke trotzdem für alle Antworten.

Aber ich habe noch eine Frage zu dem CreateTimer - WaitTimer, was bewirkt es eigentlich, hab nur mal gelesen das es ins programm sollte. und manche sagen dass ich noch ein flip oder so machen soll. klar das kenne ich aber manchmal steht da 1 oder auch 0 muss ich hier etwas von nehmen?
Mit freundlichen Grüßen: GearTechDE

Propellator

BeitragFr, Dez 02, 2011 18:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Flip mit Parameter 1 bewirkt Regelung durch VSync - soweit ich weiss musst du dann die Timer-Sache nicht mehr selbst erledigen, bin mir jedoch nicht sicher. VSync versucht durch spezielles synchronisieren der Bilddaten mit dem Bildschirm das Screentearing zu verhindern, kann jedoch zu verzögert gefühlter Eingabe führen.

Wenn du keinen Timer benutzt, bzw. VSync nicht an ist, läuft dein Programm mit der maximalen anzahl Frames, die es schafft. Da dies gut und gerne mal 200 FPS sein können, kannst du dir gerne ausrechnen wie viele Bytes dann in deine Verbindung geschaufelt werden. Smile
Propellator - Alles andere ist irrelephant.
Elefanten sind die Könige der Antarktis.

GearTechDE

ehemals 'KillerJo96'

BeitragFr, Dez 02, 2011 18:45
Antworten mit Zitat
Benutzer-Profile anzeigen
xD okey ich lese mich einfach noch ein bisschen in das ganze netzwerkzeugs rein. ich denke mal das krieg ich schon irgendwie geregelt. ich bin jetzt erstmal froh, dass bis jetzt alles so läuft wie es soll.. vielen Dank
Mit freundlichen Grüßen: GearTechDE

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group