Zum Inhalt springen

Empfohlene Beiträge

Geschrieben (bearbeitet)

Guten Morgen Leute,

ich plane ein kleines multiplayer Minispiel, welches ich rein aus Lernzwecken schreiben möchte.

Ich möchte anhand dieses Minispiels lernen, wie man eine sinnvolle und performante Multiplayerverbindung erstellt.

Das Spiel soll folgendermaßen aussen. Ich möchte eine unbestimmte Spieleranzahl auf einer Weltraumkarte verzeichnen. Die karte wird genau 50000 x 50000 Pixel groß. Man hat ein kleines Raumschiff mit dem man durch diese Karte fliegt. Mitspieler sollen natürlich nur im unmittelbaren Umfeld des eigenen Schiffes angezeigt werden. Man kann sich dieses Spiel im Prinzip wie Spacewars vorstellen.

Nun meine Fragen:

- Wie baue ich eine Multiplayer Verbindung auf bzw wie rufe ich die aktuellen Koordinaten der relevanten Spieler auf?

- Ist dies durch MySQL möglich? Wenn ja, sollte ich am besten eine persistente Verbindung verwenden oder doch eine normale?

- Welche anderen Möglichkeiten habe ich, um mein Ergebnis performant zu erreichen?

Vielen Dank für eure Hilfe :)

P.S: Ich habe gerade bei Webdesign gesehen, dass Javascript dort behandelt wird. Ich bitte um Verzeihung und um Verschieben. Danke

Bearbeitet von String
Geschrieben

Nun meine Fragen:

- Wie baue ich eine Multiplayer Verbindung auf bzw wie rufe ich die aktuellen Koordinaten der relevanten Spieler auf?

- Ist dies durch MySQL möglich? Wenn ja, sollte ich am besten eine persistente Verbindung verwenden oder doch eine normale?

- Welche anderen Möglichkeiten habe ich, um mein Ergebnis performant zu erreichen?

Eine Datenbank dazu zu verwenden ist definitiv der falsche Weg um Positionsangaben ständig zu aktualisieren. Bevor Du das mit Javascript etc machst, würde ich erst einmal zu einer reinen auf Sockets basierender Anwendung raten, d.h. rein auf ein LAN beschränkt.

Überlege Dir welche Modelle gibt es, damit sich die einzelnen Clients finden können und wie können diese dann kommunizieren. Es ist ein schlechter Ansatz, wenn jeder Client auf die Datenbank connected (real wird dies eh nicht funktionieren). Bei solchen Projekten solltest Du wirklich damit beginnen zu überlegen, welche Kommunikation gibt es, welche Kommunikation muss wie garantiert sein und welche Laufzeit darf es für welche Kommunikation maximal geben.

Geschrieben

Danke für deine Antwort. Grundsätzlich habe ich verstanden worauf du hinaus möchtest. Könntest du mir dazu ein paar Stichpunkte nennen, mit denen ich anfangen kann bzw die mir bei meiner Suche helfen? Leider weiß ich keinen Ansatz.

Geschrieben
Leider weiß ich keinen Ansatz.
Ich glaube, du zäumst das Pferd von hinten auf. Du machst dir Gedanken über Implementierungsdetails und Performance, hast aber anscheinend noch überhaupt keine Vorstellung von der Architektur deines Spiels.

Jeder Spieler braucht ein Stück Software, das seine Eingaben entgegennimmt und die Sicht des Spielers anzeigt. Zusätzlich muss auch irgendwo der Gesamtzustand des Spiels gespeichert werden. Am einfachsten geschieht das an zentraler Stelle. Damit hättest du eine klassische Client/Server-Architektur. Jetzt musst du dir überlegen, wann welche Informationen ausgetauscht werden müssen, und wo welche Daten gespeichert werden müssen. Wenn das klar ist, kannst du anfangen, dir Gedanken darüber zu machen, wie du die Daten transportierst und speicherst.

Geschrieben
Ich glaube, du zäumst das Pferd von hinten auf. Du machst dir Gedanken über Implementierungsdetails und Performance, hast aber anscheinend noch überhaupt keine Vorstellung von der Architektur deines Spiels.

Dem schieße ich mich an und die Erklärung von Klotzkopp ist auch sehr richtig, ich möchte das noch ein bisschen ausführen und stelle Dir die Frage, warum nimmst Du mySQL? Wer sagt Dir, dass mySQL überhaupt notwendig ist und dass warum nimmst überhaupt eine SQL Datenbank bzw. warum überhaupt eine Datenbank !?

Es gibt zig verschiedene Technologien, die man verwenden kann, manche sind sinnvoller als andere um eben Dein Spiel zu entwickeln, im Grunde musst Du die richtige Technologie raus suchen und Dir überlegen, wie Du sie verwendest (gleiches gilt für JS).

Da das für Dich ja ein absoluter Einstieg ist, würde ich Dir erst einmal vorschlagen, dass Du z.B. Siebzehn und vier oder Kniffel als Startspiel nimmst, d.h. Du schreibst ein Programm, dass jeder Spieler auf seinem System startet und dann eben mit anderen Spielen kann. Beschränke das Spiel erste einmal auf ein LAN. Alleine dabei wirst Du schon einige Probleme haben z.B. was passiert wenn der Rechner eines Spielers abstürzt, wie finden die Spieler sich um gemeinsam Spielen zu können. Woher weiss jeder Spieler wann er dran ist. Wie verfährst Du, wenn ein Spieler gewonnen hat, scheidet er dann aus dem Spiel aus oder wird das ganze Spiel abgebrochen, woher weiss dann jeder Spieler, dass das Spiel beendet ist. Wenn sich z.B. ein Spiel über mehrere Tage hinzieht, was passiert mit dem aktuellen Spielstand, d.h. wenn z.B. ein Spieler das Programm beendet, soll dann sein Spielstand nicht mehr existieren oder irgendwo gespeichert werden, wenn er gespeichert werden soll, wo geschieht das (dieses Problem würde z.B. beim Schach entstehen, wenn eine Partie über Tage oder Wochen gespielt wird).

Diese ganzen Fragen musst Du zuerst einmal klären und Dir überlegen, wie man das dann in Quellcode auch umsetzt, denn wenn das nicht richtig funktioniert, dann wird Dein Spiel niemals wirklich funktionieren.

Du fängst aktuell an Dir Gedanken über die GUI zu machen, also das was der Spieler nachher sieht, das ist der falsche Ansatz, denn die GUI ist im Grunde der letzte Punkt im Designprozess, d.h. er wird dann gemacht, wenn die ganze Spiellogik steht und die Schnittstellen definiert wurden, d.h. ob Du da nun ein Raumschiff durch eine Karte bewegst oder ein Männchen durch eine Landschaft ist völlig egal, denn das ist "nur" Visualisierung, wenn die Logik darunter gut designed wurde, dann kann ich die GUI flexibel austauschen.

Nimm eine beliebige OOP Programmiersprache (Java, C++, Python, C#...), mit der Du einmal ein lokal laufendes Programm erstellen kannst. Dann überlege Dir, wie man nun in der Sprache entsprechende Klassen entwirft, die eben Daten aus dem lokal laufenden Programm an ein anderes System übertragen, dann überlege die, wie sich über das Netzwerk überhaupt mehrere Programme verbinden lassen (sprich mehrere Spieler), dann überlege Dir, welche Daten Du nun zwischen den Spielern übertragen muss und wie Du die eben netzwerktechnisch übertragen kannst (z.B. wie umgehst auch das Problem, dass ein Spieler seinen Spielstand verändert und somit manipuliert um zu gewinnen), wie schaffst Du es z.B. bei Kniffel, dass die Spieler immer in der richtigen Reihenfolge dran sind usw.

Wenn Du dies erst einmal ohne ein GUI umsetzen kannst, dann kann man darauf dann sich darüber unterhalten, wie man nun eine GUI ansetzt und wie man Dein Konzept dann ggf so erweitert, dass dies auch über das Internet spielbar wird.

Geschrieben
Guten Morgen Leute,

Nun meine Fragen:

- Wie baue ich eine Multiplayer Verbindung auf bzw wie rufe ich die aktuellen Koordinaten der relevanten Spieler auf?

- Ist dies durch MySQL möglich? Wenn ja, sollte ich am besten eine persistente Verbindung verwenden oder doch eine normale?

- Welche anderen Möglichkeiten habe ich, um mein Ergebnis performant zu erreichen?

Im Browser hast du das Problem, dass du eine Seite anfragst und dann eine dynamisch generierte Seite (zB durch php gescriptet) geliefert bekommst. Das heißt, du musst die Seite refreshen. Um das Problem zu lösen gibt es Ajax. Damit kannst du über JavaScript im Hintergrund laufende Requests (Seitenaufrufe) ausführen und den zurückgelieferten Code (zB HTML, JavaScript, JSON, XML, TXT) auswerten. Wenn das Spiel nicht alle paar Millisekunden synchronisiert sein muss, würde ich das empfehlen. Ist Echtzeit notwendig, kannst du dir Websockets anschauen. Diese ermöglicht dir, mit einem Server ständig in Verbindung zu stehen um die notwendigen Daten zwischen den Spielern zu synchronisieren.

Um die Daten zu speichern gibt es verschiedene Möglichkeiten. Ist Echtzeit zB nicht wichtig, spricht nichts dagegen, ab und an die Positionen von anderen Spielern in der Nähe über eine Datenbank abzufragen. Willst du aber ein Action-Shooter erstellen, würde das nicht performant sein, da könntest du die Positionen im Arbeitsspeicher belassen (und dann ggf. alle x Sekunden in eine DB übertragen, falls der Server mal abschmiert).

Geschrieben

@pr0gg3r: Ich halte den Ansatz mit Websockets, d.h. hier auf eine explizite Technologie zu verweisen für sehr bedenklich, denn bevor der OP kein Architekturkonzept entworfen hat, ist das Festlegen auf eine Technologie der falsche weg, denn dann wird anhand der Technologie das System umgesetzt. Nicht die Technologie bestimmt das System, sondern das System die Technologie.

In dem Zusammenhang kann ich direkt anführen, ob man überhaupt eine synchrone bzw asychrone Verbindung braucht, d.h. das System bestimmt die Kommunikationsweise, zusätzlich ist auch direkt die Frage, ob man eine Kommunikation wie TCP oder UDP benötigt. Diese Fragen müssen aufgrund der Architektur beantwortet werden, die aber aktuell fehlt.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...