TCP Mausübertragung - Ein paar Probleme
Übersicht

![]() |
GearTechDEehemals 'KillerJo96'Betreff: TCP Mausübertragung - Ein paar Probleme |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo, ich habe mir es jetzt nochmal zugetraut mit TCP und versucht ein kleines test beispiel zu programmieren. Was raus gekommen ist:
Was klappt: ![]() Was nicht klappt: ![]() also ich habe einen server: BlitzBasic: [AUSKLAPPEN]
und einen client: BlitzBasic: [AUSKLAPPEN]
die miteinander daten austauschen, leider funktioniert das meist viel zu langsam oder auch garnicht. und es hängt sich bei mir alles nach einer zeit auf -.- ich wollte euch fragen, was hier das problem sein könnte, denn ich bin beide codes jetzt schon seid 2 stunden am durchsuchen und zu überlegen was ich da und da verbessern kann, aber solangsam fällt mir echt nichts mehr ein. könnt ihr mir helfen? |
||
Mit freundlichen Grüßen: GearTechDE |
![]() |
ToeB |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also ich weiß nicht ob du dich da n bissel mehr beschäftigt hast mit UDP oder TCP, aber TCP ist ein Protokoll welches zuerst immer prüft, ob die Nachricht beim Empfänger gelandet ist. Und das kann unter Umständen sehr zeitaufwendig werden. Deswegen solltest du für Positions-Übertragungen auch lieber UDP nehmen. Dort ist zwar nicht gewährleistet, das jede Nachricht ankommt, ist dafür aber umso schneller. Du kannst dir damit auch selber ein Protokoll basteln, welches ähnlich funktioniert wie TCP, nur das die Nachrichten nicht das Programm an sich blockieren sondern der Sendevorgang im Hintergund abläuft (Kannst dir dazu ja mal meine SimpleUDP3.0 angucken -> Signatur).
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! |
![]() |
GearTechDEehemals 'KillerJo96' |
![]() Antworten mit Zitat ![]() |
---|---|---|
Leider ist mein Problem, das ich weder mit UDP und noch deiner Simple UDP (was ziemlich dumm ist) nicht klarkomme. Warum auch immer, ich versteh es einfach nicht. | ||
Mit freundlichen Grüßen: GearTechDE |
![]() |
ToeB |
![]() Antworten mit Zitat ![]() |
---|---|---|
Bei der SimpleUDP sind Beispiel Dabei, da kannst du sehen welche Befehle wofür sind.
Zum Hosten eines Spiels (Server): Code: [AUSKLAPPEN] UDP_SessionCreate( SpielerAnzahl, Modus=NETSESSION, Port )
Zum Joinen auf einen Host (Server): Code: [AUSKLAPPEN] UDP_SessionConnect( ServerIP$, ServerPort, Holepunching=False )
Umbedingt ausführen (in der Hauptschleife): Code: [AUSKLAPPEN] UDP_SessionUpdate( )
Das sind die Grundlagen. Um Nachrichten zu senden, Code: [AUSKLAPPEN] UDP_wByte( Byte )
UDP_wShort( Short ) UDP_wInt( Int ) UDP_wFloat( float ) UDP_wString( Str$ ) UDP_SendMsg( Header, ClientID=SENDTO_ALL, Modus=SEND_Normal ) Das ganze ist so gedacht, das du in eine Nachricht gleich mehrere Daten gleichzeitig abschicken kannst. Einfach das Gewünschte reinschreiben und mit UDP_SendMsg absenden. In deinem Beispiel: Code: [AUSKLAPPEN] UDP_wInt( MouseX() )
UDP_wInt( MouseY() ) UDP_SendMsg( 5, SENDTO_ALL, SEND_Normal ) Um diese Nachrichten zu Empfangen, einfach so prüfen : Code: [AUSKLAPPEN] While UDP_RecvMsg( ) ;Ob eine Nachricht empfangen wurde
tmpID = UDP_MsgFromID( ) ;Von welchem Spieler die Nachricht ist tmpHeader = UDP_MsgHeader( ) ;Welche NachrichtenID die Nachricht hat Select tmpHeader Case 5 ;Header oben bei SendMsg angegeben p_MouseX( tmpID ) = UDP_rInt( ) ;Aus der Nachricht einen Integer auslesen p_MouseY( tmpID ) = UDP_rInt( ) End Select Wend Für genaueres kannst du ja mal das Beispiel "Sample #01 - Verbinden" angucken. 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Dein Problem liegt eher darin, dass du jedesmal eine riesige Menge an Daten durchboxt.
Der String als Client-Identifikation brauchst du eigentlich nicht jedesmal mitzusenden, und normalerweise sendet man nicht bei jeder Bewegung die ganze Position sondern sendet eine Veränderung bzw. die Richtung und interpoliert dann, das eigentliche syncen der gesamten Position findet nur alle x Millisekunden statt. Jedoch könntest du dir mal UDP ansehen. Bei Positionsdaten musst du dir keinen Kopf um Paketverluste machen. Wenns hart auf hart kommt, kannst du immer noch die "ENet" library verwenden, die ist ganz bequem. MfG PS: @ToeB: Schamlose Werbung much? |
||
Propellator - Alles andere ist irrelephant.
Elefanten sind die Könige der Antarktis. |
![]() |
GearTechDEehemals 'KillerJo96' |
![]() Antworten mit Zitat ![]() |
---|---|---|
Zitat: PS: @ToeB: Schamlose Werbung much? -> xD lol Naja ich denke mal ich will aber generell lernen wie man UDP benutz und mir nich irgendwelche funktionen abnehmen lassen -.- Dann guck ich mir lieber noch ein paar udp beispiele an und versuch daraus zu lernen trotzdem danke |
||
Mit freundlichen Grüßen: GearTechDE |
![]() |
ToeB |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Propellator Lesen ist auch nicht grad einer deiner Stärken oder ?
Zitat: Kannst dir dazu ja mal meine SimpleUDP3.0 angucken -> Signatur
Ich deute ihn lediglich darauf hin, meine Lib anzugucken, da sie ein "Modul" für das Senden von UDP-Nachrichten enthält, welches sicherstellt das die Nachrichten auch ankommen. In meinem zweiten Post wollte ich ihm nur zeigen, wie die Grundschritte aussehen, da er meinte er komme damit nicht klar. Also nix schamlose Werbung. @Killerjo69: Dann schreib doch einfach "Ich wills lernen" und ich hätte mir den Post oben auch sparen können. 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! |
![]() |
GearTechDEehemals 'KillerJo96' |
![]() Antworten mit Zitat ![]() |
---|---|---|
Zitat: Dann schreib doch einfach "Ich wills lernen" und ich hätte mir den Post oben auch sparen können.
ja tut mir leid ^^ hat vielleicht einer ein simples udp tutorial? ich finde momentan keins -.- |
||
Mit freundlichen Grüßen: GearTechDE |
![]() |
Propellator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi, der Hilfeartikel zu CreateUDPStream![]() 1. Ein UDP-Stream hat keine feste Zieladresse und keinen festen Zielport. (Der lokale Port kann entweder manuell oder automatisch gewählt werden.) 2. Ein UDP-Stream unterscheidet nicht zwischen Server und Client. Er kann immerhin Nachrichten von mehreren Quellen entgegennehmen und auch an mehrere Quellen verschicken. 3. Ein UDP-Stream stellt nicht sicher, dass wirklich eine Verbindung besteht. Es gibt keinen Handshake, und es wird nicht garantiert dass Pakete in der richtigen Reihenfolge oder überhaupt ankommen. So funktionierts also: Senden: Mit WriteByte ![]() ![]() ![]() Empfangen: Zuerst musst du das Paket mit RecvUDPMsg ![]() ![]() ![]() Wichtig! "ip" ist immer eine IP im Integer-Format. Diese kannst du so erhalten: BlitzBasic: [AUSKLAPPEN] HostIP(CountHostIPs("eine.normale.string.ip")) MfG Propellator PS: @ToeB: NO U. |
||
Propellator - Alles andere ist irrelephant.
Elefanten sind die Könige der Antarktis. |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
also... ich kann mir nicht vorstellen, dass die paar pippi-Daten, die hier zu senden sind unter TCP wirklich zu timing-problemen führen.
Es gibt hier zwar eine "nur UDP macht Sinn"-Fraktion, die alle anderen Protokolle gerne zum Bereich "Kommunikation durch Brieftauben" einordnen möchte, ich aber rate Dir den Fehler wo anders zu suchen! Durch das Takten mit 60Hz und Flip 1 kommen die Clients viel zu selten dazu die Nachrichten auszuwerten. Außerdem werden bei Deinem Code die Mausdaten (obwohl unverändert) zuoft wiederholt gesendet. Straffe dies und sende nur im Bedarfsfall. Das dürfte reichen, um die Performance ausreichend zu steigern. |
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Midimaster hat Folgendes geschrieben: also... ich kann mir nicht vorstellen, dass die paar pippi-Daten, die hier zu senden sind unter TCP wirklich zu timing-problemen führen.
Nicht in der Datenmenge liegt das Problem, sondern in BlitzBasics Implementation von TCP. Wie bereits erwähnt wurde, wird bei jedem gesendeten Datenpaket kontrolliert, ob dieses ankam und dessen Erhalt sichergestellt. Solange das Paket unterwegs ist, macht BlitzBasic Nichts anderes als den Datentransfer sicherzustellen. Und Pakete sind im Internet immer lange unterwegs. Relativ gesehen. 16ms reichen zumindest nicht, um das Paket zu senden und auf den Erhalt zu warten - ergo sind FPS-Zahlen von 60 unter Verwendung von TCP in BlitzBasic nicht realisierbar. Aus diesem Grund: Für reine Chats oder Rundenbasierte Spiele: TCP Für Spiele, bei denen es auf die Geschwindigkeit ankommt: UDP |
||
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
ah, jetzt glaub ich hab ich das zum ersten Mal richtig verstanden! Danke Hozchopf!
Wäre dann eine logische Optimierung (vorausgesetzt man würde unbedingt TCP verwenden wollen), dass man die zu versendenen Daten in ein Bündel schnürt und dann mit nur einem WriteString() versendet? Und sehe ich das jetzt so richtig: Keine TCP Nachricht kann schneller in BB verarbeitet werden als ein Ping zwischen den beiden Computern an Zeit benötigt? Als in einem internen Netzwerk sind zwar <5msec möglich, aber via Internet könnten es auch >100msec werden? Gilt dies auch so für BMax? |
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nein, BMax blockiert nicht. | ||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
ToeB |
![]() Antworten mit Zitat ![]() |
---|---|---|
Besser wäre dann du nimmst ne Bank und schreibst mit WriteBytes![]() mfg ToeB |
||
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! |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group