Ich habe früher mal mit TCP etwas gemacht, aber das ist ja schon lang her, seit dem kaum noch überhaupt programmiert.
Nun meine folgende Frage:
Wie übergebe ich am besten die Daten?
- In Texten jede Aktion einzeln rüber schicken?
Also vom Prinzip her Befehle versenden... "Objekt1 set position 4/3/5"
- Oder immer komplett alle daten übermitteln? (also alle spielerdaten)
Da kann man doch Records übermitteln? (wenn ja, in welchem abständen am besten?)
Ich hab mich auch erst vor kurzem mit Datenübertragung übers Netzwerk für mein aktuelles Projekt herumschlagen müssen.
Also als Text ist das vllt nicht so optimal, da die Daten dann ja mehr Speicher benötigen, besser wäre es dann wohl das ganze als Binärdaten zu übertragen.
Und zu bei dem "komplett oder einzeln", kommt es wohl darauf an wie groß der Datensatz ist. Weil bei TCP noch andere Daten als die Nutzdaten übertragen werden (Header), kann es sein das zB 2 mal 1/3 des gesamten Datensatzes mehr als 1 mal 3/3 wird. Dann lohnt sich das einzeln verschicken natürlich nicht.
Dann zu den Zeitabständen: So selten wie möglich, sollte man denke ich anpeilen, da man dann wohl eher davon ausgehen kann, das auch bei niedrigeren Übertragungsraten kein Stau entsteht. Wie oft man die Daten dann wirklich übertragen muss, hängt von der Qualität der Interpolation/Extrapolation und der Art des Programms ab. Wenn es eine Art Shooter ist, muss man wohl relativ häufig Daten übertragen, bei Strategiespielen eher weniger, oder es ist etwas ganz anderes, kA. Mehr als 50mal in der Sekunde ist denke ich bei beiden nicht nötig, was aber jetzt nur so eine Schätzung ist.
Außerdem solltest du dich vielleicht auch mal in Richtung UDP umschauen, weil da die Daten schneller übertragen werden, da ein paar Sachen eingespart werden. Weiß jetzt nicht ob das komplett keinen Header hat, aber sicher ist das die Nutzdaten einen größeren Anteil in jedem Paket haben. Der Nachteil ist dabei allerdings das es fehleranfällig ist. Das heißt das Pakete verloren gehen können oder vielleicht auch Fehler enthalten. Damit kann man entweder Leben, wenn die Daten sowieso schnell überschrieben werden, oder man muss selbst für Fehlerkorrektur sorgen. Ach, außerdem kann es sein das die Pakete in einer anderen Reihenfolge ankommen, also muss man so ein bischen Fehlerkorrektur wohl immer betreiben. Bei mir zumindest hat es sich gelohnt und der Unterschied war deutlich sichtbar (im LAN). Bei den meisten Spielen wird es wohl so gemacht dass UDP für die Daten während des Spielens benutzt wird und TCP zum Beispiel für Authentifizierung.
Wenn man UDP in einem Shooter (o.ä.) benutzt geht man meist so vor:
1. Man sendet jedesmal sämtliche Daten. Also keine relativen Positionsdaten oder ähnliches => absolute Daten
2. Man sendet immer eine Packet-ID mit, die einfach mit jedem Paket inkrementiert wird.
Geht ein Paket verloren ist dies kein Problem, da man mit dem nächsten Paket wieder die vollständigen korrekten Daten erhält. Kommen die Pakete in der falschen Reihenfolge an, ist auch dies kein Problem. Anhand der Packet-ID kann man ältere Pakete leicht erkennen und ignorieren.
Ich hab mich auch mal damit beschäftigt und habe festgestellt, dass es vor allem 2 wichtige Unterschiede zwischen TCP und UDP gibt:
1. Verlust
TCP: Alle Pakete kommen immer komplett und in der richtigen Reihenfolge an
UDP: Wie oben schon erwähnt, ist UDP fehleranfällig
2. Broadcasts
Soweit ich das Thema verstanden habe (sollte ich mich irren, alles weitere schnell wieder vergessen ), unterstützt nur UDP broadcast Meldungen, was für Spiele sehr wichtig sein kann, bzw. ist. Broadcast Nachrichten werden nicht nur an einen Rechner geschickt, sondern jeder, der auf dem entsprechenden Port "zuhört" kann sie lesen. Bei TCP geht das glaube ich nicht, da gibt es immer nur 1-zu-1 Verbindungen. Bei Spielen wo viele Spieler mitspielen können und nicht nur 2 ist also UDP sinnvoller, allerdings muss man dann auch (wie schon gesagt) auf Fehler achten
2. Broadcasts Soweit ich das Thema verstanden habe (sollte ich mich irren, alles weitere schnell wieder vergessen ), unterstützt nur UDP broadcast Meldungen, was für Spiele sehr wichtig sein kann, bzw. ist. Broadcast Nachrichten werden nicht nur an einen Rechner geschickt, sondern jeder, der auf dem entsprechenden Port "zuhört" kann sie lesen. Bei TCP geht das glaube ich nicht, da gibt es immer nur 1-zu-1 Verbindungen. Bei Spielen wo viele Spieler mitspielen können und nicht nur 2 ist also UDP sinnvoller, allerdings muss man dann auch (wie schon gesagt) auf Fehler achten
Ja, das kann gut sein. Ich habe bis jetzt noch nicht mit UDP gearbeitet, aber mit TCP kriegst du sowas (zumindest mit den Mitteln, die mir bisher zur Verfügung standen) nicht hin. Dort gibt es immer einen Server, der jeden Client einzeln bedient, und dann ggf. natürlich auch Pakete mehrfach verschickt. Das ist etwas Zeitaufwändiger - und eben Performance ist ja der Vorteil von UDP.
Naja, UDP-Broadcasts sind nicht wirklich so sinnvoll, denn sie funktionieren selbstverständlich nur im LAN. Wenn du im Internet spielen willst, werden diese
Broadcasts nicht funktionieren. Das einzige, wofür ich UDP-Broadcasts nutze, ist für das suchen von Servern im LAN. Ansonsten läuft es so ab, wie Yogu gesagt hat.
Ich würde mir überlegen, welche Daten bei dem Spiel übertragen werden müssen. Bei meinem (Tuxbomber) sind das nur sehr wenige, ein paar Byte pro Ereignis und Benutzereingabe. Dabei kommt es nicht wirklich auf Geschwindigkeit an, deswegen hab ich mich für TCP entschieden, denn da kommt auch alles wirklich an. Wenn du allerdings ein Spiel hast, wo sehr viel übertragen wird, solltest du auf UDP setzen (fürs Internet halt ohne Broadcasts).
Was die Art der Übertragung angeht: Ein kleines Protokoll, welches einzelne Befehle und deren Argumente kapselt und verschickt ist da wohl angebracht. Hier findest du ein ausführliches Tutorial, wie man soetwas angehen kann. Wenn einem das noch nicht genug ist kann man die ganzen Daten auch noch in binärer Form übertragen (gibts dort auch ein Tutorial für). Damit kann man dann auch Dateien o.Ä. verschicken.
Markus
Edit: Falls mein Beitrag irgendwie den Eindruck erweckt, dass UDP nur broadcasten kann, so war das natürlich nicht beabsichtigt. Wäre ja auch ziemlich blöd, wenn man nicht auch an einzelne Adressen senden könnte.
Zuletzt geändert von Markus am Fr Feb 20, 2009 20:07, insgesamt 1-mal geändert.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
UDP kann auch an eine bestimmte IP senden. Es geht nicht nur Broadcast, aber es geht (im gegensatz zu TCP, wie hier schon richtig bemerkt wurde) auch Broadcast. Für Serversuche im LAN in der Tat sehr hilfreich.
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Ich habe ja die Sockets nicht installiert und das geht anscheind auch nicht bei PE versionen.
Also wie bekomm ich das hin, dass die events auch aufgerufen werden wenn etwas empfangen wird oder so?
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Hmm... Mein Delphi 6 PE hat noch die TCPServerSocket und TCPClientSocket-Komponenten... Ansonsten, kannst du dir die Indys anschauen - wobei die wirklich komplex sind und man da auch nicht einfach ein Event bekommt, soweit ich das bisher rausbekommen habe.
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
also soweit ich weis sind die "alten" socketkomponenten bei delphi 7+ deaktiviert worden, weil sie instabil sind, d.h. wenn du große dateien (über sendstream) verschickst gibts probleme - ansonsten sind mir keine bekannt und ich benutze sie auch lieber als die tcp sockets.... naja, aber wenn du noch nen bisschen was an der performance schrauben willst, dann kannst du dich ja mal in die winsockets mit api reinarbeiten - das ist das selbe nur "entkapselt" - sprich du musst dir alle methoden noch selbst schreiben, kannst dafür aber halt auch alles selbst schreiben
persönlich bin ich kein großer freund von udp, weil es wie schon gesagt, unsicher ist. möglicherweise macht es auch sinn, wenn du mehrere verbindungen öffnest - dann kannst du mit der einen die steuerung deines datenstroms vornehmen. macht aber nur sinn, wenn du auch wirklich viele daten haben solltest.
Also, ich benutze in meinem Fall tcp, weil es nicht viele Daten sind ...
Folgendes Problem gleich zu anfangs :-/ Laut Tutorial sollte das funktionieren?
Code:
function TGameControl_Server.CreateGame():boolean;
begin
ServerSocket := TServerSocket.Create(GLForm);
ServerSocket.OnClientConnect:= ClientConnect;
ServerSocket.Port:= PORT;
ServerSocket.Open;
end;
Hab das result noch nicht deklariert, aber das ist ja eine andere sache
Beim ausführen dieser Funktion, bekomm ich eine Fehlermeldung, er stoppt beim ausführen des Creates von TServerSocket.
die GLForm ist schon erstellt und angezeigt zu dem moment. Es wird beim Create AOwner: TComponent erwartet.... :-/
Mitglieder in diesem Forum: Bing [Bot] und 5 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.