Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

21

03.03.2013, 18:26

Es gibt viele Multiplayer-Spiele, die teils gezwungenermaßen TCP/IP benutzen und gut funktionieren, WoW nutzt AFAIK auch nur TCP.
Da fühl ich mich schon mal beruhigt :D
Ich würde an Deiner Stelle versuchen eine Bibliothek für die Kommunikation zu finden. Oft kann man die dann auch auf UDP umstellen. Außerdem solltest Du Dir überlegen sowas wie protobuf von Google zu nutzen, das wurde bei Diablo 3 auch eingesetzt, sowas erhöht Deine Produktivität sicher. Schau mal hier, da spricht ein erfahrener Spieleentwickler über Netzwerkbibliotheken: http://www.codeofhonor.com/blog/choosing-a-game-network-lib
Interessanter Artikel - bin ihn eben mal überflogen.

Aber ich glaube ich werde den an dieser Stelle nur als Inspiration verwenden. Zwecks Bibliothek habe ich mich bereits für SDL_net entschieden. Alles was ich "mehr" haben will, werde ich mir selber implementieren - vorwiegend aus dem Grund "Lernen-wie-Dinge-funktionieren" :search:


LG Glocke

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

22

03.03.2013, 20:02

Es stimmt, dass viele Entwickler vorschnell UDP nutzen und dann mehr schlecht als recht ein TCP drauß stricken. Mit zum Teil fatalen Folgen (siehe networklibbenc - müsste ich aber mal dringend bei Gelegenheit aktualisieren). Das Problem bei TCP ist, dass viele z.B. am nagle-ack-issue scheitern ohne es wirklich zu wissen (weil das kann zu seltsamen hick-ups in der Übertragung führen).

Zitat von »"Glocke"«

nd warum sollte Gott keine Aktualisierungen über UDP verschicken? :D

Mir ging es eher darum, dass man lieber Objekte vom Server auf Clients spiegeln sollte, als dass man ein P2P oder ein "Clients müssen sich alles selbst merken/berechnen" Ansatz verwendet. Weil dann ist der Schritt zum OoS ein sehr kurzer.

Netzwerk ist halt prinzipiell einfach, aber der Teufel steckt im Detail weil es maximal asynchron ist.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

23

03.03.2013, 23:53

Man liest so oft, dass UDP für solche Dinge viel besser ist als TCP. Das Problem vermute ich hierbei ist, dass man sich das ganze erst mal theoretisch überlegt. Dann kommt man natürlich zu der Annahme, dass UDP viel besser/schneller ist, da es viele Dinge nicht überprüfen muss. Das ist alles soweit auch korrekt. Nun muss man aber überlegen. Was benötige ich für Features von TCP für mein Spiel? Was benötige ich vor allem wie häufig? Meistens kommt man zu dem Schluss das man viele Features von TCP benötigt und zwar für recht viele Daten. Jetzt kann man natürlich anfangen, TCP selbst zu implementieren und intern UDP nutzen. Das Problem hierbei ist, dass TCP und UDP in der Hardware implementiert sind. Das ist natürlich viel viel schneller als wenn ich jetzt Highlevel (am besten noch mit irgendeiner Skriptsprache) den ganzen kram nachbastel. Dadurch kann ich mir das ganze also selbst langsam machen. Viel wichtiger als das ist, dass TCP vermutlich auch noch mehr als ausreichend ist. Wenn man sich ein paar Gedanken macht kann man Nachrichten vielleicht sinnvoll zusammen fassen und verkürzen. Es gibt allgemein sehr viele Möglichkeiten zu optimieren. Vermutlich läuft es damit hinterher stabiler und schneller wenn man hier richtig angeht. Übersicht ist ein weiterer Faktor. Mit TCP kann ich den Code möglicherweise sehr schlank halten. Vermutlich schlanker, als wenn ich TCP selbst implementiere (sollte klar sein;) ). Nun warum liest man dann so oft im Internet, dass UDP doch das muss ist? Die meisten die das schreiben haben es selbst vermutlich nie getestet. Hier wird Halbwissen weiter getragen, was irgendwo aufgeschnappt wird. Am sinnvollsten ist meiner Meinung nach, und das trifft auf viele Probleme beim entwickeln zu, erst mal den einfachen Weg zu gehen. Wenn ich merke, dass ich optimieren muss, dann kann ich damit anfangen. Versuch es dir erst einfach zu machen. Wenn das nicht klappt kannst du es immer noch kompliziert versuchen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

24

04.03.2013, 06:40

Meistens kommt man zu dem Schluss das man viele Features von TCP benötigt und zwar für recht viele Daten.
Den Satz musste ich einfach nochmal zitieren, denn genau das ist bei Spielen nämlich meist der Fall. Die meisten der verschickten Pakete will man ja tatsächlich an alle Clients oder den Server schicken, sodass auch garantiert ist, dass sie ankommen und das meist auch noch in der richtigen Reihenfolge. Sonst landet man in Out of Synch oder der Spieler fühlt sich laggy.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

25

04.03.2013, 17:03


Netzwerk ist halt prinzipiell einfach, aber der Teufel steckt im Detail weil es maximal asynchron ist.
Rein vom Funktionsprinzip ist es auch einfach :D ... immer dieser Detail-Teufel ]:->

Dann kommt man natürlich zu der Annahme, dass UDP viel besser/schneller ist, da es viele Dinge nicht überprüfen muss.
Gerade weil es weniger Features bietet als TCP ist es ja so schnell ... hat Vorteile, hat Nachteile :D

Nun muss man aber überlegen. Was benötige ich für Features von TCP für mein Spiel? Was benötige ich vor allem wie häufig? Meistens kommt man zu dem Schluss das man viele Features von TCP benötigt und zwar für recht viele Daten. Jetzt kann man natürlich anfangen, TCP selbst zu implementieren und intern UDP nutzen. Das Problem hierbei ist, dass TCP und UDP in der Hardware implementiert sind. Das ist natürlich viel viel schneller als wenn ich jetzt Highlevel (am besten noch mit irgendeiner Skriptsprache) den ganzen kram nachbastel.
Headshot :pillepalle: ... :D

Wenn man sich ein paar Gedanken macht kann man Nachrichten vielleicht sinnvoll zusammen fassen und verkürzen. Es gibt allgemein sehr viele Möglichkeiten zu optimieren. Vermutlich läuft es damit hinterher stabiler und schneller wenn man hier richtig angeht.
Ich finde es auch sinnvoller an eben dieser Stelle anzusetzen, als erstmal TCP "nachzubauen" und damit auch ewig viel Zeit zu verschenken.

Nun warum liest man dann so oft im Internet, dass UDP doch das muss ist? Die meisten die das schreiben haben es selbst vermutlich nie getestet. Hier wird Halbwissen weiter getragen, was irgendwo aufgeschnappt wird. Am sinnvollsten ist meiner Meinung nach, und das trifft auf viele Probleme beim entwickeln zu, erst mal den einfachen Weg zu gehen. Wenn ich merke, dass ich optimieren muss, dann kann ich damit anfangen. Versuch es dir erst einfach zu machen. Wenn das nicht klappt kannst du es immer noch kompliziert versuchen.
Ich denke genau das werde ich machen: erstmal mit TCP arbeiten und schauen, ob meine Anwendung damit an die Grenzen kommt; und dann ggf. noch einmal überlegen/Hilfe suchen/etc.

Den Satz musste ich einfach nochmal zitieren, denn genau das ist bei Spielen nämlich meist der Fall. Die meisten der verschickten Pakete will man ja tatsächlich an alle Clients oder den Server schicken, sodass auch garantiert ist, dass sie ankommen und das meist auch noch in der richtigen Reihenfolge. Sonst landet man in Out of Synch oder der Spieler fühlt sich laggy.
Ich wüsste halt jetzt auch nicht mehr, welche Pakete denn verloren gehen dürften :D Ich glaube das macht echt nur Sinn, wenn die Pakete - wenn sie am Client antreffen - qualitativ schon veraltet sind, und im nächster (möglichst kurzer Zeit) aktualisiert und die Daten somit überschrieben werden würden.


Okay, OoS heißt also Out of Sync :D Gut zu wissen; ich hatte überlegt was das heißen könnte :thumbsup:


LG Glocke

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

26

04.03.2013, 21:10

Ohh pardon. Für mich ist das als Spieler der Grund warum ich viele Netzwerkprogrammierer hasse. Je nachdem was du vorhast kannst du natürlich schon ein Stockwerk über TCP/UDP ansetzen und direkt eine Lib nutzen, die dir Zustände spiegeln kann. Wobei mir da nur zwei einfallen. Die eine ist Raknet und deren System ist nach meinen Tests sehr schnell überfordert und das andere ist eher weniger spielorientiert und sah ziemlich overheadlastig aus. Daher habe ich mir selbst was gestrickt, was ich aber eigentlich auch schon vor Jahren mal komplett neu aufziehen wollte, weil es doch ein einigen Stellen hapert.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

simbad

unregistriert

27

18.03.2013, 13:30

Ich habe das Gefühl, das hier einiges bezüglich UDP und TCP durch einander geht.
UDP ist packet orientiert und vor allem Verbindungslos. Es gibt keine Garantie, das Pakete überhaupt ankommen oder in der gleichen Reihenfolge wie sie verschickt worden sind. Das Internet ist grundsätzlich in der Lage die Daten zwischen zwei Punkten auf unterschiedlichen Wegen zu transportieren. Was im Umkehrschluss bedeutet, das ein neueres Paket ein altes überholen kann.
UDP ist das egal.
TCP ist hingegen ein Verbindungsbezogenes Protokoll. Der TCP/IP Stack garantiert, das die Daten in der richtigen Reihenfolge an die Anwendung übergeben werden. Das bedeutet auch, das im Zweifel gewartet wird, bis ein fehlendes Paket Eintrift. Auch ist ein Re-Transmission bei Übertragungsfehlern vorgesehen.

Wenn einem also egal ist ob alle Pakete ankommen, zum Beispiel VOIP ist sowas, dann nimmt man UDP.
Wenn man die Daten sicher transportieren will, dann nimmt man TCP.

Da UDP nur den Absender der IP enthält, Musst du auch noch in dem Paket Informationen vorhalten, die den Absender identifizieren. Das wird bei TCP nicht gebraucht, da ja die Verbindung eindeutig ist.
Bei UDP kann ich alles in einem Thread erledigen mit einer Socket. Bei TCP muss ich ein Listen machen, die Verbindung entgegennehmen und dann entsprechend der Anzahl der Clients auch entsprechend viele Sockets verwalten.

Nur mal um ein wenig Licht ins Dunkel zu bringen. Hoffe das hilft ein wenig beim Verständnis.

Werbeanzeige