Registriert: Di Feb 25, 2003 15:10 Beiträge: 147 Wohnort: Koblenz a. Rhein
Kann man mit UDP nur einen String senden ? keine Variabeln oder sowas ?
Also müsste ich bei einem Game ( z.b. Shooter ) die Spielerposittion in einen String pappen ? und jeder schuss bla bla bla... ? wie das ?
Ich hätte da eine Ideen aber die kostet bestimmt viel Rechenzeit... (px: Playerposition y py:... pz) einfach ..Send(px py pz) dann nach den Leerzeichen suchen ( aber bei jeder Bewegung das ganze durchkauen ? kann man keine Variablen senden ?
thx und cya !
_________________ mir fällt kein Spruch mehr ein für meine Signatur naja...
Registriert: Sa Mai 04, 2002 19:48 Beiträge: 3830 Wohnort: Tespe (nahe Hamburg)
Es wäre hilfreich zu wissen, wie du deine Daten versenden willst. Über reine Socks über Indy... ein String wäre definitiv das falscheste was Du nehmen könntest
_________________ "Light travels faster than sound. This is why some people appear bright, before you can hear them speak..."
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Also man könnte natürlich ein Package für eine Variable verwenden aber das wäre eine ziemliche Verschwendung.
Ich persönlich würde den "string" als Binärinterpretieren. Weil so könntest du Zahlen ganz leicht und einfach auf ein geringeres Datenvolumen bekommen. Nebenbei würde auch noch der lästige Umcodierungsaufwand (Zahl -> Text -> Zahl) wegfallen. Größere nahmhafte Spiele codieren das allerdings noch mal um Bandbreite zu sparen.
PS: Die Indiekomponenten bieten eine recht gute Sammlung zum Thema Netz.
Man kann eigentlich jeden beliebigen Datentype über UDP senden. Bei dem sendto Befehl gibt man ja Addresse und Länge des Buffers an, den man an eine bestimmte IP Addresse senden möchte. Da ist es am besten, wenn man die Position direkt als Vector versendet und nicht erst als String speichert. Vielleicht kann man ja bei den Indy Komponenten das Socket Handle herausfinden und dann über sendto die Daten direkt senden.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Ja genau das. In Variable kannst du alles reinwerfen wonach dir ist. Also String, PChar, Pointer, Arrays etc. Aber bei so etwas solltest du aufpassen, dass der Typ auch am Stück im Speicher liegt. Array of Array of single. Zum Beispiel kann verstreut im Speicher liegen.
Aber Vorsicht SizeOf liefert bei Pointer immer 4 zurück. Also die Größe des Pointers nicht die Größe vom Inhalt. Auch wenn der Pointer nil ist wird 4 zurückgegeben.
Am Besten wäre es wohl, wenn man die gesammten Daten erst einmal sammelt und die dann in einem SendBuffer schickt. Dabei würde man auch gewehrleisten können, dass so wenig wie möglich Pakete geschickt werden würden. Wobei UDP (wie bereits schon mal erwähnt) ein Protokoll ist, bei dem es nicht sichergestellt ist, dass auch wirklich alle Pakete ankommen. Es kann sein, dass das ein oder andere Paket mal im Netz verschwunden bleibt. Das solltest du beim Designen deiner Pakete auch berücksichtigen. Sprich deine Anwendung darf sich davon nicht stören lassen, wenn auf einmal ein Paket fehlt. Andernfalls solltest du TCP verwenden. Dort ist es sichergestellt. Dafür hast du aber auch ein wenig höhere Netzlast.
Registriert: Di Feb 25, 2003 15:10 Beiträge: 147 Wohnort: Koblenz a. Rhein
is schon klar dass paar verloren gehen ... wird aber ein shooter also nich so tragisch wenn da 1 von 20 positionen ma nich ankommen merkt keiner.. wenns aber paar nacheinander sind ( siehe Half-Life ) gibts schöne lags
_________________ mir fällt kein Spruch mehr ein für meine Signatur naja...
Für die meisten Ereignisse wie Tastatureingaben vom Client zum Server oder Entity Updates die sowieso jeden Frame kommen macht das nichts aus. Nur wenn ein Level gewechselt wird, ein neues Entity hinzukommt oder gelöscht wird, usw... muß die Nachricht angekommen. Man kann jeder gesendeten Nachricht eine Nummer geben und zusätzlich immer die Nummer der zuletzt empfangenen Nachricht mitschicken. Dann fällt das auf, wenn eine Nachricht fehlt. Bei Quake 1 ist übrigends immer nur eine sichere Nachricht zur gleichen Zeit unterwegs. Das scheint aber zu reichen.
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
NiGhTmArE hat geschrieben:
is schon klar dass paar verloren gehen ... wird aber ein shooter also nich so tragisch wenn da 1 von 20 positionen ma nich ankommen merkt keiner.. wenns aber paar nacheinander sind ( siehe Half-Life ) gibts schöne lags
Zitat:
wenns aber paar nacheinander sind ( siehe Half-Life ) gibts schöne lags
Nein, das passiert bei einer kommerziellen Engine nicht.Kommerzielle Engines wie die Unreal-, Quake oder HL-Engine (wobei die von HL ja auf Quake basiert) haben so ne Art Bewegungsvorhersage, und berechnen dann an jedem Client (und Server) die Spielerposition und gleichen diese dann an wenn ein neues Positionspaket ankommt. Bei hohen Pings sieht man dann ja oft, das ein Spieler vor einem steht und dann ganz plötzlich wieder weg ist.Das liegt dann daran, das die Bewegungsvorhersage des Netzwerkcodes damit gerechnet hat, das sich der Spieler stetig in seine aktuelle Richtung weiterbewegt.Da das dann aber z.B. nicht der Fall war und der Spieler stehen geblieben ist, hat die Vorhersage fehlgeschlagen.
Für ein kleines Freizeitprojekt ist eine solche Bewegungsvorhersage allerdings eine viel zu komplexe Sache und eigentlich auch ein eigenes Gebiet für sich.In NapalmBomber3D schick ich auch nur in regelmäßigen Abständen die Spielerposition zum Server.Wenn da mal wegen hohem Ping oder starkem Netzwerktraffic ein paar Pakete nicht ankommen, macht das ja nichts aus, mal davon agesehen das die Bewegung etwas ruckeliger wird.
Mitglieder in diesem Forum: Bing [Bot] und 0 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.