3d Engine mit GUTER Netzwerkunterstützung ?

Hallo,

als Hobbiespieleprogrammierer würde ich gerne endlich mal ein vernünftiges Netzwerkspiel schreiben.
Bisher bin ich daran stets gescheitert, ich habe Programme wie z.b. Blitz3D ausprobiert, die sind toll um Singleplayergames zu basteln, und bieten jede Menge unterstützung … wenn es dann allerdings an Netzwerkspiele geht, darf man jede Bewegung, jede Positionsänderung, jedes erstellen eines Objektes gleich mehrmals schreiben,
(für den client und den server, jeweils in sendener und empfangener Richtung)
ich persönlich werd dabei wahnsinnig und hatte immer das Problem,
dass ich das nur in kleinem Rahmen hin bekommen habe,
sobald es mehr wurde, stellte sich mein Selbstgebasteltes Netzwerkprotokoll als ineffizient heraus, entweder wurde es richtig langsam, oder der Entwicklungsaufwand wuchs mit allem was ich neu einbaute exponentiell …

Nun meine Frage: Kennt ihr eine Entwicklungsumgebung/3D-Engine, welche die 3D Objekte(und vlt sogar noch deren Eigenschaften) automatisch synchronisiert, so dass ich meinen code schreibe, als wäre es ein Singleplayer Spiel - oder wo ich zumindest nur in Ausnahmefällen unterscheidungen treffen muss zwischen Multiplayer & Singleplayer?
Und falls es das nicht gibt - befürche ich ja schon fast - könnt ihr mir dann vielleicht etwas empfehlen, was diesem Bedürfnis wenigstens näher kommt und einem etwas Arbeit in dieser Hinsicht abnimmt ?
Ich will ja auch kein MMORPG bauen, es reicht schon wenn das 2-4 Spieler über’s internet oder LAN zocken können, und das halbwegs ruckelfrei vonstatten geht.

als Hobbiespieleprogrammierer würde ich gerne endlich mal ein
vernünftiges Netzwerkspiel schreiben.

Hört, hört…

Bisher bin ich daran stets gescheitert, ich habe Programme wie
z.b. Blitz3D ausprobiert, die sind toll um Singleplayergames
zu basteln, und bieten jede Menge unterstützung

Öh, kläre mich mal auf, was das ist. Was ich eben so mit einem Auge gelesen habe, ist Blitz3d ein BASIC derivat. Ich weiß nicht, ob das ne gute Idee ist, Echtzeitabläufe über verteilte Systeme oder Echtzeit 3d Rendering über ne Interpretersprache regeln möchte.

dann allerdings an Netzwerkspiele geht, darf man jede
Bewegung, jede Positionsänderung, jedes erstellen eines
Objektes gleich mehrmals schreiben,

Vertehe ich nicht so ganz. Die Darstellung macht der Client. Änderungen der Objekte sollten darüber laufen, daß die Objekte irgendwie wissen, wie sie sich verändern (Methoden, Funktionen) und das einfach vom Server getriggert wird.

dass ich das nur in kleinem Rahmen hin bekommen habe,
sobald es mehr wurde, stellte sich mein Selbstgebasteltes
Netzwerkprotokoll als ineffizient heraus, entweder wurde es
richtig langsam, oder der Entwicklungsaufwand wuchs mit allem
was ich neu einbaute exponentiell …

Kann man so nicht beurteilen, ich kann weder hellsehen, wie Du das konzeptioniert hast, noch wie das in diesem Blitz3d aussieht.

Nun meine Frage: Kennt ihr eine
Entwicklungsumgebung/3D-Engine, welche die 3D Objekte(und vlt
sogar noch deren Eigenschaften) automatisch synchronisiert, so
dass ich meinen code schreibe, als wäre es ein Singleplayer
Spiel - oder wo ich zumindest nur in Ausnahmefällen
unterscheidungen treffen muss zwischen Multiplayer &
Singleplayer?

Das sind 2 paar Schuhe. Grafische Darstellung ist was anderes, wie Dein Rechnernetzprotokoll.

Und falls es das nicht gibt - befürche ich ja schon fast -
könnt ihr mir dann vielleicht etwas empfehlen, was diesem
Bedürfnis wenigstens näher kommt und einem etwas Arbeit in
dieser Hinsicht abnimmt ?

3D Darstellung auf jeden Fall mit openGL. Wenn Du noch komplexere Dinge brauchst, eine komplette fertige Engine wie Oger. Verbindung der Rechner über UDP. Genauer könnte man da was zu sagen, wenn Du mehr erzählst.

Genauere Beschreibung (könnt was länger werden ^^)
Hallo,

nagut, ich hatte versucht es möglichst kurz zu fassen,
aber verständlich sollte es natürlich trotzdem sein
(merkt man ja nicht immer selbst, ob man nur Kauderwelsch redet, ich hoffe das ist diesmal nicht so)

Alsooo: (in epischer Breite erklärt:smile:

  1. Ich arbeite am liebsten mit komplett integrierten Entwicklungsumgebungen, die sowohl die Sprache (also Kompiler, Editor - natürlich mit code-completition, als auch eine fertige Engine enthalten.
    Blitz3D ist zum Beispiel so etwas - man codet zwar in einer Basic-ähnlichen Sprache, das Ergebnis wird aber kompiliert, also keine Intepretersprache mehr …
    Dort hat man einen Editor, in dem man seinen Code schreibt, ihn kompiliert, und es steckt auch eine 3D-Engine dahinter, welche einem gewisse in die Sprache bereits eingebaute Funktionen zur Verfügung stellt, z.B. um Modelldateien einzubinden.
    Um es ganz klar zu sagen: Ich möchte NICHT die ersten Wochen/Monate meines Projektes damit verbringen, meine eigene 3D-Engine zu schreiben,
    dafür würden meine mathematischen Kenntnisse auch gar nicht ausreichen …

  2. Diese Programme verfügen in der Regel über eine eingebaute STRUCT, welche von Sprache zu Sprache einen anderen Namen trägt, aber in der Regel folgende Attribute enthält:
    -verwendete Modelldatei
    -Position im 3D-Raum
    -Blickrichtung
    -… usw
    Ich nenne sie im folgenden entsprechend ihres Blitz-3D-Namens „Entity“.
    Der Spieler in dieser 3D-Welt ist also ein Entity, seine Gegner ebenfalls,
    so wie auch fast alle beweglichen sichtbaren Objekte, usw…

  3. Man kann also sagen es wird einem sehr leicht gemacht ein Singleplayergame zu bauen.
    Man lädt eine 3D-Datei, hackt ein wenig code rein ,und schon rennt der gegner auf einen zu, und lässt sich per Polygonrakete ins Datennirvana befördern.
    Wenn man das ganze dann aber netzwerktauglich haben will, hört der Spass auf, denn dann gibt es keine komfort Funktionen mehr,
    der eine Client kann dem anderem Client nicht einfach sagen,
    was der Entity gemacht hat, sondern man muss sich selbst ein Protokoll ausdenken zum Übertragen seiner Daten.
    Ich meine mit Protokoll jetzt nicht UDP/TCP, sondern den Teil der OSI-Anwendungsschicht, also was für Daten ich übertrage,
    und wie diese zur Synchronisation der Entities auf den verschiedenen Clients verwendet werden.
    Beispiel des Inhaltes so eines Paketes (zu verstehen als Array)
    „7;125;11;12;13“

  4. Wert: Gibt an, dass es sich um eine Positionsänderung handelt

  5. … welche sich auf Entity Nr. 125 im Spiel bezieht (i.d.R. sind sie durchnummiert)

    • 5: 3 Integer, die Zusammen den neuen Positionsvektor bestimmen.
      Dies wäre jetzt die Art Netzwekprotokoll die ich meinte.
      Ich muss ja nicht UDP neu erfinden, das kann man natürlich nutzen,
      aber man muss sich alt, und genau DAS ist das Problem - eine eigene Netzwerkkommunikation ausdenken, und darin bin ich nicht so fürchterlich gut.

Was ich mir nun wünsche ist eine Integrierte Entwicklungsumgebung,
welche einem nicht nur die Physik etwas einfacher macht (davon gibts ne Menge) sondern halt auch die Synchronisation der Entities,
so dass also, wenn ich auf einem PC sagen wir die Spielfigur bewegen will,
das Programm selbstständig diese Information an alle anderen Clients weiter leitet, und ich mir nicht selbst solche tollen (und fürchterlich ineffizienten) Protokolle ausdenken muss wie das weiter oben grob skizzierte - sondern mich auf das Spiel selbst konzentrieren kann.
(Es geht mir hier also nicht darum, wie ich in ein bestimmtes Spiel am besten Netzwerkfähig mache, sondern welche Komplettlösung mir dieses Problem im gröbsten abnehmen kann)

Viele Grüße,
David

  1. Ich arbeite am liebsten mit komplett integrierten
    Entwicklungsumgebungen, die sowohl die Sprache (also Kompiler,
    Editor - natürlich mit code-completition, als auch eine
    fertige Engine enthalten.
    Blitz3D ist zum Beispiel so etwas - man codet zwar in einer
    Basic-ähnlichen Sprache, das Ergebnis wird aber kompiliert,
    also keine Intepretersprache mehr …
    Dort hat man einen Editor, in dem man seinen Code schreibt,
    ihn kompiliert, und es steckt auch eine 3D-Engine dahinter,
    welche einem gewisse in die Sprache bereits eingebaute
    Funktionen zur Verfügung stellt, z.B. um Modelldateien
    einzubinden.

Aha…Du hast also protietäres Zeug, mit dem Du mit Klicki-Bunty Code erzeugst. Damit wirst Du nie die Möglichkeiten haben, die Du mit einer unabhängigen modernen, objektorientierten Programmiersprache hast.

Um es ganz klar zu sagen: Ich möchte NICHT die ersten
Wochen/Monate meines Projektes damit verbringen, meine eigene
3D-Engine zu schreiben,

Davon habe ich auch mit keinem Wort geredet. Nochmal zum Nachlesen, was openGL und Oger sind:
http://de.wikipedia.org/wiki/Opengl
http://de.wikipedia.org/wiki/OGRE

  1. Diese Programme verfügen in der Regel über eine eingebaute
    STRUCT, welche von Sprache zu Sprache einen anderen Namen
    trägt, aber in der Regel folgende Attribute enthält:
    -verwendete Modelldatei
    -Position im 3D-Raum
    -Blickrichtung
    -… usw
    Ich nenne sie im folgenden entsprechend ihres Blitz-3D-Namens
    „Entity“.
    Der Spieler in dieser 3D-Welt ist also ein Entity, seine
    Gegner ebenfalls,
    so wie auch fast alle beweglichen sichtbaren Objekte, usw…

  2. Man kann also sagen es wird einem sehr leicht gemacht ein
    Singleplayergame zu bauen.
    Man lädt eine 3D-Datei, hackt ein wenig code rein ,und schon
    rennt der gegner auf einen zu, und lässt sich per
    Polygonrakete ins Datennirvana befördern.
    Wenn man das ganze dann aber netzwerktauglich haben will, hört
    der Spass auf, denn dann gibt es keine komfort Funktionen
    mehr,
    der eine Client kann dem anderem Client nicht einfach sagen,
    was der Entity gemacht hat, sondern man muss sich selbst ein
    Protokoll ausdenken zum Übertragen seiner Daten.

Das heißt also, daß Dein Baukasten an die Genzen stößt, was man damit machen kann.

Ich meine mit Protokoll jetzt nicht UDP/TCP, sondern den Teil
der OSI-Anwendungsschicht, also was für Daten ich übertrage,
und wie diese zur Synchronisation der Entities auf den
verschiedenen Clients verwendet werden.
Beispiel des Inhaltes so eines Paketes (zu verstehen als
Array)
„7;125;11;12;13“

Böp, böp, böp, böp, böp…langsam. Ein PROTOKOLL ist ne Absprache zwischen den beiden Sendenden, was was bedeutet. Kann man damit vergleichen, daß man in der Regel seinen Namen am Telefon zuerst nennt, wenn man angerufen wird. Und Dein Protokoll WILLST Du auf UDP aufsetzen. Erstens, weil es nen verbindungslosen Socket, der das kann vermutlich außer in Fortran und Cobol in JEDER PROGRAMMIERSPRACHE gibt, zweitens weil Du keine verbindungsorientierte Verbindung mit TCP willst.
Und wenn das dann steht, dann kommt der Inhalt der Übertragung dran.

Was ich mir nun wünsche ist eine Integrierte
Entwicklungsumgebung,
welche einem nicht nur die Physik etwas einfacher macht (davon
gibts ne Menge) sondern halt auch die Synchronisation der
Entities,
so dass also, wenn ich auf einem PC sagen wir die Spielfigur
bewegen will,
das Programm selbstständig diese Information an alle anderen
Clients weiter leitet, und ich mir nicht selbst solche tollen
(und fürchterlich ineffizienten) Protokolle ausdenken muss wie
das weiter oben grob skizzierte - sondern mich auf das Spiel
selbst konzentrieren kann.

Hm schwierig. Ich würde schauen ob Amazon da Literatur zu hat. Oder mal Google nach Tutorials fragen. Vor allem aber glaube ich, daß Dein komischer Klicki-Kontainer Dich behindert in dem was Du tun kannst.

Hallo,

einmal richtig teuer

http://www.jenkinssoftware.com/raknet/manual/RakNetM…

einmal günstig :smile:
http://www.klick3d.de/gameengines.htm

Hallo,

Du hör mal ich möchte mich jetzt eigentlich nicht mit Dir darüber streiten, ob ein Baukastensystem besser ist, als Programmierung in DirectX und Co.

Wenn ich jetzt ein groß angelegtes Kommerzielles Spiel bauen wöllte,
in einem Team von erfahrenem Programmierern, dann macht das was Du sagst durchaus Sinn, und ist mir auch klar.

WENN ich aber wie schon gesagt ein Hobbyprogrammierer bin,
und meine Spiele einfach nur just 4 fun sind, um mit den eigenen Freunden was daddeln zu können, dann wäre das einfach überskaliert.

Und das Problem was ich habe, habe ich AUCH wenn ich alles von Hand mache,
ohne Baukasten, nur dass ich dann wenn ich alles von Hand habe,
auch noch weitere Probleme dazu kriege…

Ausserdem ist es nicht so, dass mich mein Baukastensystem dort einschränkt, sondern lediglich, dass er mir an der entsprechenden Stelle keine Hilfe gibt, und ich sie mir grade an dieser Stelle wünschen würde.

Die Frage war ja nun nicht „Ist ein Baukastensystem generell besser oder schlechter als direkte Programmierung, am besten auch noch in C++“,
sondern „WELCHES Baukastensystem wäre dabei zu empfehlen ?“

Du wirst es nicht glauben aber die Vor und Nachteile von Baukastensystemen sind mir durchaus klar:

-Baukasten:
Schnelle Ergebnisse am Anfang, komplexere Dinge die der Entwickler des Systems nicht vorhergesehen hat, sind aber schwieriger und später gar nicht mehr um zu setzen.
-Echte Programmiersprache:
Anfangs recht mühselig, kann Monate dauern bis man einen einfachsten Shooter zusammen hat, dafür aber auch keinerlei Beschränkung in den Möglichkeiten (ausser dem eigenem Skill und der eigenen Zeit).

Schlussfolgerung:
-Für kleine Projekte Baukasten, für wirklich große echte Programmiersprache

Falls übrigens noch jemand sucht, ich habe inzwischen etwas recht feines gefunden, nennt sich unity3D.
Da habe ich sowohl die Möglichkeit, Dinge im Baukasten zu kombinieren ALS AUCH darauf oben drauf gesetzt noch zu scripten mit relativ wenig Einschränkungen.
Und Spielobjekte werden auf Wunsch einfach automatisch zwischen Client und Server aktualisiert.
Jaja, natürlich würde man sich bei großen Spielen lieber eine eigene, optimierte Variante zusammenbasteln, aber hey, um die Spielfiguren der Spieler zu synchronisieren in einem kleinem, netten FPS Shooter reicht das völlig aus…

Viele Grüße,
David

Hallo,

also für Raknet gibts ne freie Indy-Lizens :smile:

Falls ich mal mit einer Sprache wie Ogre oder Irrlicht arbeiten sollte,
ist es schön zu wissen das es sowas gibt.

Hab mich jetzt aber erstmal für Unity3D entschieden in der Zwischenzeit,
hab Dank für die kurze und unkomplizierte Antwort :smile:

Viele Grüße,
David