Simples Netzwerk-Multiplayerspiel nur unter Benutzung von Free/Open-Source Bibliotheken



  • Hallo,

    ich wollte schon immer ein einfaches Multiplayerspiel schreiben. Nun habe ich mich umgeschaut und beschlossen Irrlicht als Engine zu benutzen (wobei Ogre die einzige alternative war)

    Was mir aufgefallen ist: Für Graphik, Sound, Input gibt es reife Bibliotheken, aber für Netzwerkkommunikation anscheinen nur low-level? D.h., wenn ich eine simultane Simulation auf dem Server und den Clients implementieren will, muss ich einen Großteil selbst schreiben, z.B. mit Sockets oder Enet, oder Boost asio? Oder gibt es etwas anderes, das ich bis jetzt übersehen habe?

    ---
    Nebenbei: Zunächst wollte ich das ganze in Python im Rapid-Prototyping-Stil machen, aber die Performance-Einbußen mit pyglet + twisted scheinen immens zu sein. Dagegen bietet twisted sehr angenehme Abstraktionen wie RPC/sicheres Versenden von Python-Objekten u.s.w..
    Gibt es hier beispiele für gelungene Implementationen?



  • Bertram Weiss schrieb:

    Was mir aufgefallen ist: Für Graphik, Sound, Input gibt es reife Bibliotheken, aber für Netzwerkkommunikation anscheinen nur low-level? D.h., wenn ich eine simultane Simulation auf dem Server und den Clients implementieren will, muss ich einen Großteil selbst schreiben, z.B. mit Sockets oder Enet, oder Boost asio? Oder gibt es etwas anderes, das ich bis jetzt übersehen habe?

    Du kannst ja einen Blick auf SFML werfen, da gibts auch einen Netzwerkteil. Ich weiss aber nicht, ob er dir genügt, ansonsten bietet SFML auch sonst einiges (2D-Grafik, Eingabebehandlung, Sound, Threads, Unicode).

    Vielleicht ist auch POCO etwas für dich, damit kenne ich mich allerdings nicht aus.



  • Nexus schrieb:

    Bertram Weiss schrieb:

    Was mir aufgefallen ist: Für Graphik, Sound, Input gibt es reife Bibliotheken, aber für Netzwerkkommunikation anscheinen nur low-level? D.h., wenn ich eine simultane Simulation auf dem Server und den Clients implementieren will, muss ich einen Großteil selbst schreiben, z.B. mit Sockets oder Enet, oder Boost asio? Oder gibt es etwas anderes, das ich bis jetzt übersehen habe?

    Du kannst ja einen Blick auf SFML werfen, da gibts auch einen Netzwerkteil. Ich weiss aber nicht, ob er dir genügt, ansonsten bietet SFML auch sonst einiges (2D-Grafik, Eingabebehandlung, Sound, Threads, Unicode).

    Vielleicht ist auch POCO etwas für dich, damit kenne ich mich allerdings nicht aus.

    Danke für die Antwort. Auf den ersten Blick sehen beide Bibliotheken wie low-level-wrapper für Sockets aus, d.h. es gibt im Prinzip nur Byte-basierte oder kommunikation, und evtl noch handling für einfache Datentypen. Gibt es auch etwas um ganze Klasseninstanzen bequem versenden zu können? Eventuell auch in anderen Bibliotheken?



  • Gibt es auch etwas um ganze Klasseninstanzen bequem versenden zu können? Eventuell auch in anderen Bibliotheken?

    Naja das sind zwei unterschiedliche Aufgabenstellungen:

    1. Serialisierung + Deserialisierung
    2. Netzwerk-Kommunikation

    Beides in eine Library zu vermischen halte ich nicht für besonders sinnvoll.



  • Das "Problem" dabei ist, dass C++ aus verschiedenen Gründen keine Reflection-Möglichkeiten hat. Es ist also nicht möglich, zur Laufzeit z.B. alle Member einer beliebigen Variablen abzufragen. Das Auslesen des Speichers ist auch wenig erfolgsversprechend, sobald die Klasse Pointer als Member hat (und sei es auch nur der Pointer auf die vtable).
    Ergo musst du sowieso Funktionen schreiben, die deine Klassen in Byteströme und zurück wandeln. Und diese kannst du dann auch leicht übers Netzwerk verschicken.



  • Als ich mal nach sowas gesucht hab, bin ich über Massiv gestolpert. Habe es aber nie ausprobiert.



  • hustbaer schrieb:

    Gibt es auch etwas um ganze Klasseninstanzen bequem versenden zu können? Eventuell auch in anderen Bibliotheken?

    Naja das sind zwei unterschiedliche Aufgabenstellungen:

    1. Serialisierung + Deserialisierung
    2. Netzwerk-Kommunikation

    Beides in eine Library zu vermischen halte ich nicht für besonders sinnvoll.

    Ja, das stimmt. Ursprünglich suchte ich eine Bibliothek die eine Kommunikationsstruktur vorgibt die für gängige Spielgenres geeignet ist, also zum Beispiel parallele Simulation, verlustfreie / verlustbehaftete kommunikation etc. Wenn es das im open source bereich nicht in dieser Form gibt, (evtl. weil es sowieso jeder selbst schreiben muss, um effizient zu sein?) dann muss ich mehr Arbeit reinstecken und es zusammenstückeln.

    Also: Welche Open-Source Serialisierungsbibliothek könnt ihr empfehlen? Es sollte schon effizient sein, d.h. XML/Andere Plaintext-Spielereien sind nicht erwünscht.

    @ipsec:
    Ich möchte natürlich nur bestimmte Klassen serialisieren, die mir zur Compilezeit bekannt sind -- alleine schon weil ich eine Konsistenzprüfung auf Empfängerseite machen muss. Dennoch vermute ich dass jemand schon eine (gute) Abstraktion für diese Aufgabe geschrieben hat, da man so etwas oft benötigt.



  • ProgChild schrieb:

    Als ich mal nach sowas gesucht hab, bin ich über Massiv gestolpert. Habe es aber nie ausprobiert.

    Das sieht auf den ersten Blick gut aus 👍. Ich brauche zwar nicht MMO sondern nur MO, aber das könnte sich richten lassen. Ich werde es mir demnächst anschauen.



  • Du könntest dir mal Boost.Serialization ansehen. Ist relativ mächtig und kann auch binär serialisieren.
    Für Spiele wäre aber vielleicht doch eine Speziallösung sinnvoll, um die Daten klein zu halten.
    D.h. bools nur als 1 Bit speichern, führende Nullbytes bei Integers eliminieren (ala UTF8) etc.
    Das werden vermutlich die wenigsten fertigen Serialisierungs-Frameworks können.

    D.h. ich muss meine Aussage etwas relativieren: es kann durchaus Sinn machen Serialisierung und Netzwerk-Kommunikation in eine Library zu packen, da es schwer sein wird eine für Netzwerk-Spiele "passende" Serialisierungs-Library zu finden.

    Und natürlich bei Libraries ala Massiv, die relativ High-Level sind, macht es auch Sinn. Bzw. ist es fast unumgänglich.


Anmelden zum Antworten