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

Kitarios

Frischling

  • »Kitarios« ist der Autor dieses Themas

Beiträge: 2

Beruf: Student

  • Private Nachricht senden

1

24.02.2015, 01:32

GESUCHT Netzwerk Bibliothek für 2D Spiel mit SFML und C++. RakNet als möglicher Kandidat.

Hallo ihr Spieleprogrammierer da draußen.

Ich suche Beratung im Bezug auf Netzwerk Bibliotheken für ein laufendes Projekt, da ich bisher noch nichts mit Netzwerk programmiert habe.

Erstmal was zur aktuellen Situation und unserem Projekt, damit ihr euch alles besser vorstellen könnt:
- 4 beteiligte Personen(3 Programmierer, 1 Grafiker)
- Programmierung in C++
- SFML für Graphik/Sound/etc.
- Entwicklungsplattform Windows, Zielplattform zunächst Windows (evtl. wollen wir es dann auch portieren, was uns SFML auch ermöglicht)
- alle Personen sind Informatik-Studenten(haben grundlegende Kenntnisse, aber wenig größere (Spiele-)Projekte durchgeführt)

Zum Spiel selbst:
- 4 Spieler Multiplayer (kein Singleplayer geplant)
- 2D Welt, die aus Kacheln aufgebaut ist (entsprechend repräsentiert durch eine Tilemap)
- Karte grundsätzlich nicht begehbar, kann von Charakteren mit Kacheln bebaut werden
- Ziel ist das Töten der Gegner
- Spieler besitzen jeweils einen Charakter

  • kann sich auf den Kacheln bewegen
  • kann Kacheln und Gebäude bauen
  • hat verschiedene, aktive Fähigkeiten
  • direkte Steuerung, vorzugsweise über Gamepad
  • Sicht der Karte auf aktuelles Sichtfeld des Charakters beschränkt
Wir haben mit der Programmierung des Spiels schon angefangen und die grundlegenden Funktion funktionieren bereits. Bisher läuft es allerdings noch im Splitscreen und mit 2 statt 4 Spielern. Da das Gameplay u.a. darauf aufbaut, dass die Sicht auf die Karte eingeschränkt ist, soll es im fertigen Spiel keinen Splitscreen geben, sondern einen "echten" Multiplayer. Geplant ist eine Client-Server Architektur. Der Server soll als zusätzliche Anwendung auf dem Rechner eines Mitspielenden laufen. Als Anforderung reicht es, wenn die Performance für ein LAN ausreicht. Schön wäre es natürlich, wenn sich das ganze später relativ einfach (ich weiß, im Bezug auf Netzwerk ist nichts wirklich einfach^^) auf Internet-Multiplayer erweitern ließe.

Da ich kein passendes Buch gefunden habe, habe ich sehr viel im Internet zu diesem Thema recherchiert und sehe zwei mögliche Ansätze, den Multiplayer umzusetzen. In beiden Fällen möchte ich auf UDP setzen, da ich für das schnelle Gameplay mit TCP keine annehmbare Latenz erwarte. Zum einen könnte ich direkt mit Sockets arbeiten (über SFML oder andere Bibliotheken wie ENet) und "from scratch" alles selbst implementieren, oder ich benutze eine Bibliothek, die all das schon implementiert hat und mir mehr abnimmt. Ich tendiere zu letzerem, da ich, falls ich "from scratch" arbeite, mich noch intensiver einlesen müsste. Und die Informationen, die ich bisher gefunden habe, waren recht dürftig. Also suche ich eine "high-level" Netzwerk Bibliothek. Mein aktueller Kandidat ist RakNet. Von dem Funktionsumfang, der in der Dokumentation beschrieben wird, wäre das genau, was ich suche. Mein Problem derzeit: Außerhalb der offiziellen Doku finde ich keine Hilfestellung dazu. Zudem ist im RakNet-Forum kaum jemand aktiv und auch auf Github ist in den letzten Monaten kein einziger Commit hochgeladen worden.
Wie würdet ihr das einschätzen? Ist RakNet wirklich eine passene Bib für mein Vorhaben? Und würdet ihr mir raten, mich da einzuarbeiten, auch vor dem Hintergrund, dass daran (evtl.) gar nicht mehr aktiv entwickelt wird?

Danke hier schonmal fürs Lesen :)

Gruß


PS:Im Anhang ist ein Screenshot vom letzten Prototypen Build (die furchtbaren Sprites hat natürlich nicht unserer Grafiker erstellt ^^)
»Kitarios« hat folgendes Bild angehängt:
  • spieleprogrammierer_screenshot_1.PNG

birdfreeyahoo

Alter Hase

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

2

24.02.2015, 01:44

Ich habe RakNet vor einigen Jahren mal verwendet und war ganz zufrieden damit. Es hat gut funktioniert, UDP-Unterstützung hat man auch.
Wie es aber in letzter Zeit aussieht weiß ich nicht. Wurde ja von Oculus VR aufgekauft, sollte aber immernoch gut laufen.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

24.02.2015, 06:33

In beiden Fällen möchte ich auf UDP setzen, da ich für das schnelle Gameplay mit TCP keine annehmbare Latenz erwarte.
Ernsthaft, sowas sollte dringend getestet werden, bevor man irgendwelche wüsten Erwartungen aus dem Nichts erschafft. UDP hat gegenüber TCP diverse Probleme, die man eigentlich sehr ungern haben will. Man kann sich da oft eine Menge Ärger sparen, wenn man TCP nutzt. Selbst mit TCP ist ein Ping von 30ms und weniger drin. Also sollte das echt erst probiert werden. Ich frage mich eh woher dieses Vorurteil immer kommt. Es kursiert hier gefühlt in letzter Zeit immer die Meinung, dass TCP für alles zu langsam sei und das halte ich für großen Unsinn.
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]

ExCluSiv3

Frischling

Beiträge: 61

Wohnort: Düsseldorf

Beruf: Fachinformatiker - Ausbildung

  • Private Nachricht senden

4

24.02.2015, 10:59

Zitat

Raknet ist sicherlich toll, aber ich verwende nix was Lizenzen braucht.
Ich weis ja nicht wann du das letzte mal bei RakNet geschaut hast, aber interessanter weise hat die von dir gepostete Lib einen recht langen Lizenztext (im vergleich zu RakNet).

Vergleich:

Lizenz SFNUL: https://github.com/binary1248/SFNUL/blob/master/LICENSE

Lizenz RakNet: https://github.com/OculusVR/RakNet/blob/master/LICENSE

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

5

24.02.2015, 11:02

Ich hab mein Bomberman-Spiel mit UDP komplett gelöst und das hat zumindest im lokalen Netz hervorragend funktioniert. Glaube das ist vielleicht genauso ein Vorurteil zu sagen man sollte immer TCP nehmen.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

24.02.2015, 12:48

Der Vorteil der Benutzung von UDP ist, dass man selbst bestimmen kann, welche Nachrichten unbedingt und in der Originalreihenfolge ankommen müssen (indem man das selbst implementiert, bzw. es durch eine Library machen lässt), und welche nicht. Nehmen wir mal das Beispiel eines Multiplayer-Shooters. Ist es wichtig, dass jedes Positions-Update anderer Spieler 100%ig und in der originalen Reihenfolge beim Spieler ankommt? Ich würde sagen nein. TCP würde hier bei einem verlorenen/beschädigten Paket sämtliche nachfolgende Pakete aufhalten, was für mich nicht hinnehmbar wäre. Andere Nachrichten wie "Du bist jetzt tot!" oder "Spieler X hat Spieler Y getötet!" sollten natürlich zuverlässig ankommen.

Ernsthaft, sowas sollte dringend getestet werden, bevor man irgendwelche wüsten Erwartungen aus dem Nichts erschafft.

Oder man glaubt den erfahrenen Spieleentwicklern:

Zitat von »https://1024monkeys.wordpress.com/2014/04/01/game-servers-udp-vs-tcp/«

Writing a few test programs showed the WiFi occasionally dropping packets, and every time that happened, server response time shot up from 100-150 ms to 1000-2000 ms.

No amount of tweaking of TCP settings could get around this issue.

We replaced the TCP code with a custom reliable UDP implementation which cut the penalty of a lost packet down to an additional 50 ms(!) – less than the time of a complete roundtrip. And that was only possible due having complete control of the reliability layer on top of UDP.

Zitat von »http://gafferongames.com/networking-for-game-programmers/udp-vs-tcp/«

Using TCP is the worst possible mistake you can make when developing a networked action game like an FPS! To understand why, you need to see what TCP is actually doing above IP to make everything look so simple! (...)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

24.02.2015, 13:59

Na dann nenn mir mal die Lösung, die du gehst, wenn es sich bei dem verlorenen Paket um etwas wichtiges handelt - wie z.B. einen Schuss-Befehl, Bewegungs-Request des Spielers oder eigentlich überhaupt alles, was ein Spieler als Request an den Server schickt. Dass der Server Responses droppen kann, die Informationen darüber enthalten, was andere Spieler tun und dass das meist kein Problem darstellt, das ist mir auch klar.

Zitate kann auch ich aus dem Internet viele zaubern. Aber da steht noch lange nicht drin wie viel Ärger und Aufwand man sich einhandelt, damit man solche Probleme lösen kann.

Zudem glaube ich nicht jedem Neuling, dass er tatsächlich so heftig große Performance benötigt, wie er angibt, ohne dass er mit Netzwerk überhaupt schon jemals irgend etwas gemacht hat. Ich habe mehrere Jahre an einem Fast-Paced-PvP-MMORPG mitgearbeitet, da lief alles über TCP und ich habe es nicht ein einziges Mal erlebt, dass Performance und Latenz-Probleme mit TCP zu tun gehabt hätten. Sicherlich hatten auch wir Latenzen, aber die wichtigen sind immer die ausgehenden Befehle, die der User selbst auslöst - und da hast du überhaupt gar nichts davon, wenn diese nicht zuverlässig zum Server übermittelt werden - außer natürlich wütende Spieler ("ich habe 5mal geklickt und kein Schuss ging raus"). Du kannst natürlich Deiner UDP-Bibliothek sagen, dass diese Dinge wichtig sind und immer zuverlässig ankommen sollen, aber dann ist das schlecht und langsam implementiertes TCP auf UDP oben drauf. Na bravo.
Wie wäre es denn stattdessen Verbindungen sinnvoll zu trennen? Die Daten, die nicht wichtig sind und die, die es sind? Eine moderne Bibliothek kann das sicherlich, ohne dass ich sie dazu zwinge alles als Fake-TCP-over-UDP zu behandeln.


zumindest im lokalen Netz
'nough said.
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]

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »BlueCobold« (24.02.2015, 14:05)


David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

8

24.02.2015, 14:38

Na dann nenn mir mal die Lösung, die du gehst, wenn es sich bei dem verlorenen Paket um etwas wichtiges handelt - wie z.B. einen Schuss-Befehl, Bewegungs-Request des Spielers oder eigentlich überhaupt alles, was ein Spieler als Request an den Server schickt.

Nochmal schicken. Aber nicht zwingend den kompletten Paketfluss stoppen, bis das verlorene Paket dann auch irgendwann angekommen ist, wie es bei TCP der Fall ist. Bei einigen Nachrichten wie z.B. “Ich will schießen!“ bringt es dir auch wenig, wenn sie dann mit großer Verzögerung ankommen. Manchmal ist es besser, die dann komplett fallenzulassen, sonst verärgerst du den Spieler noch mehr, weil nicht nur ein Schuss nicht ausgeführt wurde, sondern eine ganze Salve mit einer großen Verzögerung, dir alles sinnlos macht.

Sicherlich hatten auch wir Latenzen, aber die wichtigen sind immer die ausgehenden Befehle, die der User selbst auslöst - und da hast du überhaupt gar nichts davon, wenn diese nicht zuverlässig zum Server übermittelt werden - außer natürlich wütende Spieler ("ich habe 5mal geklickt und kein Schuss ging raus").

Siehe oben. In einem “schnellen Spiel“ habe ich lieber einen verschluckten Schuss von 4 als 5 Schüsse mit großer Verzögerung.

Du kannst natürlich Deiner UDP-Bibliothek sagen, dass diese Dinge wichtig sind und immer zuverlässig ankommen sollen, aber dann ist das schlecht und langsam implementiertes TCP auf UDP oben drauf. Na bravo.

Das klingt jetzt aber nach Vorurteil deinerseits, sämtliche Implementierungen als schlecht und langsam zu bezeichnen. Außerdem will man ja gar nicht TCP nachbauen, denn sonst könnte man es ja direkt benutzen. Es gibt Garantien, die TCP macht, die du ggf. gar nicht brauchst (wie z.B. die Einhaltung der Originalreihenfolge der Pakete), die du aber nicht abschalten kannst und mit denen du dir letztlich ins Knie schießt. Durch eine Implementierung, die auf UDP aufbaut, kannst du diese Garantien selbst auswählen und auf deinen konkreten Anwendungsfall zuschneiden.

Wie wäre es denn stattdessen Verbindungen sinnvoll zu trennen? Die Daten, die nicht wichtig sind und die, die es sind? Eine moderne Bibliothek kann das sicherlich, ohne dass ich sie dazu zwinge alles als Fake-TCP-over-UDP zu behandeln.

Dann hast du entweder alle Garantien oder gar keine. Was dazwischen gibt's dann nicht.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

24.02.2015, 14:52

Na wie ihr meint. Empfehlt ruhig UDP, wenn Ihr Euch so sicher seid, dass das hier wirklich benötigt wird und zum Ziel führt. Mir soll das ja egal sein. :rolleyes:
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]

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

25.02.2015, 06:36

Ich weiss jetzt nicht wo der Aberglaube herkommt, dass TCP besser sein soll für Echtzeit-Spiele.
Du musst lernen zu lesen und zu verstehen. Das da hat nämlich niemand behauptet. Ich habe behauptet, dass er so eine Anforderung eventuell gar nicht hat und sich mit TCP viel Ärger spart. Aber wie gesagt, da Ihr es alle genau wisst, soll er doch machen wie er/Ihr denkt. Is nicht mein Problem :)
Übrigens switcht man nicht einfach zwischen UDP und RUDP hin und her, denn UDP ist ein Standard, während RUDP ein eigenes, proprietäres (also kein Standard) Protokoll ist. Da gibt's nicht einfach ein Flag bei den UDP-Paketen oder ähnliches, denn UDP selbst sieht das gar nicht vor.

Manchmal ist es besser, die dann komplett fallenzulassen, sonst verärgerst du den Spieler noch mehr, weil nicht nur ein Schuss nicht ausgeführt wurde, sondern eine ganze Salve mit einer großen Verzögerung, dir alles sinnlos macht.
Oder natürlich das genaue Gegenteil ist der Fall - wie etwa bei Spielen, die Skills einsetzen im Gegensatz zu "point & click Shootern". Da kann es dann sogar sehr wichtig sein die Reihenfolge einzuhalten und alles andere zerstört komplett das ganze Match, wohingegen die Verzögerung verkraftbar gewesen wäre. Ich denke jetzt auch mal ein ein RTS, wie fatal wäre es da wohl wenn zwischendrin mal hier und da Klicks verschwinden würden oder sich deren Reihenfolge ändert? Bei den APM, die in den Ranking-Spielen ablaufen, wohl eher inakzeptabel.
Aber nun ja, mehr als nochmal zu sagen, dass man seine Anforderungen kennen sollte, bevor man irgendwas empfiehlt oder Annahmen trifft, kann ich nicht tun. Man kann ja schließlich auch mit einer Rohrzange eine Schraube in die Wand drehen...
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]

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »BlueCobold« (25.02.2015, 07:00)


Werbeanzeige