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

Schwarzefee

Treue Seele

  • »Schwarzefee« ist der Autor dieses Themas

Beiträge: 155

Wohnort: Ost-Sachsen

Beruf: Programmierer

  • Private Nachricht senden

1

28.10.2020, 22:05

Reliable UDP

Hi,

ich möchte mich an einem Shooter Remake versuchen.
Ich arbeite mit Unity.

Aktuell arbeite ich mich grad in UDP ein, da ich gerne eine eigene Implementation benutzen möchte.
Meine Frage: wie implementiert man am besten rUDP?
Reicht es wenn man eine fortlaufende Nummer mitschickt, die der Empfänger dann zurückschickt wenn das Paket vollständig bekommen hat? Wenn der Empfänger in einem bestimmten Zeitraum nichts meldet, wird das Paket nochmal geschickt.


Läuft das prinzipell so ab, oder funktioniert das anders?



Gruß

Timmyew

Treue Seele

Beiträge: 128

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

2

28.10.2020, 22:53

Hey,

Wenn du mit mit TCP arbeitest, dann stellt sich die Frage garnicht erst ^^.
TCP übernimmt dann die Logik, die für die Kontrolle der Pakete zuständig ist.

Gruß,
Timmyew. :)

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

28.10.2020, 23:50

Ja, so funktioniert das ungefähr. Eine sehr empfehlenswerte Artikelreihe dazu: https://gafferongames.com/categories/bui…twork-protocol/
TCP verwendet man normalerweise nicht bei Shootern etc., da es dafür nicht gedacht ist und einige Nachteile mit sich bringt (siehe ersten Artikel).

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

4

29.10.2020, 10:25

Spiele nehmen UDP, weil sie dadurch die Wahl haben, ob sie Reliable verschicken wollen oder nicht. Die State-Updates 20x pro Sekunde schickst Du üblicherweise einfach raus, weil es egal ist, ob die verloren gehen. Bei denen reicht eine einfache Sequenz-Nummer, damit Du erkennst, falls UDP-Pakete einander zeitlich überholen.

Für's Reliable UDP brauchst Du dann irgendne Art von Paket-ID und Länge - UDP kann Dir die Pakete auch auseinander reissen. Davids Link ist da echt super.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

Schwarzefee

Treue Seele

  • »Schwarzefee« ist der Autor dieses Themas

Beiträge: 155

Wohnort: Ost-Sachsen

Beruf: Programmierer

  • Private Nachricht senden

5

11.11.2020, 21:12

Hi,

danke für den Link. So 100% verstanden hab ich ihn aber noch nicht...



Ich sende jetzt für jedes Reliable-Packet eine Sequenz-Nummer mit (ein Int) die der Empfänger dann wieder zurück sendet damit der Sender weis, dass das Packet angekommen ist.

Wie verhindere ich aber, dass in der Zeit, die der Empfänger braucht und die Antwort zu schicken, der Sender das Packet schon ein 2. mal geschickt hat.
Dann kommt das Packet ja 2 mal beim Empfänger an.


Wie kann ich sowas verhindern.




Gruß

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

11.11.2020, 22:11

Das musst du gar nicht verhindern. In einem solchen Fall "verschenkt" man zwar Bandbreite, aber ansonsten schadet das nicht. Der Empfänger merkt sich, welche Pakete er bereits bekommen hat, und wenn eines mehrfach ankommt, dann ignoriert er es einfach.

Schwarzefee

Treue Seele

  • »Schwarzefee« ist der Autor dieses Themas

Beiträge: 155

Wohnort: Ost-Sachsen

Beruf: Programmierer

  • Private Nachricht senden

7

11.11.2020, 22:30

Ok, sowas hab ich mir auch gedacht.

Aber wenn zB - auf einen Shooter bezogen - das Packet "Waffe Abfeuern" 2x beim Server ankommt, ist ja auch blöd.

Reicht es dann, wenn ich mir - zB - die letzten 100 Sequenz-Nummbern beim Empfänger merke und wenn das ankommende Packet schon drin ist, es ignoriert wird?




Gruß

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

8

11.11.2020, 23:16

Im verlinkten Artikel wird im Abschnitt "Sequence Buffers" beschrieben, wie man sich merken kann, welche Pakete bereits empfangen wurden.

Schwarzefee

Treue Seele

  • »Schwarzefee« ist der Autor dieses Themas

Beiträge: 155

Wohnort: Ost-Sachsen

Beruf: Programmierer

  • Private Nachricht senden

9

12.11.2020, 10:51

Hi,

ja das mit dem Sequence Buffer, ack und ack_bits hab ich nicht so richtig verstanden.

Könnt ihr mir das nochmal kurz erläutern?



Gruß

10

11.01.2021, 22:11

Hey,

Ich sende jetzt für jedes Reliable-Packet eine Sequenz-Nummer mit (ein Int) die der Empfänger dann wieder zurück sendet damit der Sender weis, dass das Packet angekommen ist.


hm davon würde ich - wenn es sich vermeiden lässt - eher abraten. Was passiert, wenn ein Paket nicht ankam? Schickst du es dann nach? Wie lange soll der Server das zwischenspeichern, bevor er es einfach verwirft? Was ist, wenn die Information längst veraltet ist, sobald sie ankommt? Wartet der Client ggf. mit der Prozessierung neuerer Pakete bis ältere Pakete ankamen? Falls ja, dann wäre TCP das bessere Protokoll, weil es all das für dich erledigt.

Und genau das macht es ja langsam. Idealerweise wählst du jedoch die Art der Informationen, die du verschickst, so, dass es egal ist, wenn da mal was verloren gegangen ist. Zum Beispiel würde es Sinn ergeben statt einem "Der Gegner hat sich 2 Schritte nach rechts begeben" lieber ein "Der Gegner ist an Position xy und bewegt sich mit Geschwindigkeit yz" zu verschicken.
Es gibt sicherlich Beispiele, wo sowas schwer möglich ist (z.B. beim Verschicken von Spieler-Eingaben vom Client an den Server) aber zumindest bei der Kommunikationsrichtung "Server an Client" ist das meist möglich.

Was mir sehr geholfen hat ist das Developer-Wiki von Valve. Da geht es speziell um Multiplayer-Shooter, aber auch für andere Projekte ist es als Anregung sicher spannend:
https://developer.valvesoftware.com/wiki…ayer_Networking
https://developer.valvesoftware.com/wiki…nd_Optimization

Gruß!

Werbeanzeige