Eigene game engine?

1 Antwort

Da mir aber vieles in Unity auf den Sack geht (Preismodell, veraltete systeme) (...)

Ich bezweifle, dass das Preismodell für dich eine tatsächliche Relevanz hat und was du mit veralteten Systemen meinst, ist unklar. Nichtsdestotrotz gibt es zahlreiche Alternativen (CryEngine, Godot, IOLITE, O3DE, Stride, Torque3D, Unreal, usw.), die ich mir an deiner Stelle zuerst genau anschauen würde, bevor ich damit beginne, eine neue Engine zu entwickeln, die funktional für lange Zeit nicht an die bestehenden Anwendungen heranreichen wird.

Explizit für Voxel Games gibt es für einige Engines (Unity, Unreal) außerdem noch externe (Community-)Plugins.

Wie sollte die Softwarearchitektur sein

Beschäftige dich mit dem ECS, aus Unity sollte es dir ja an sich schon bekannt sein. Darüber kannst du die Hierarchie/Struktur deiner Spielwelt beschreiben (Stichwort: actor model; es gibt eine Scene View mit verschiedenen, eigenständigen Akteuren - seien es Script Controller, Sprites, Audioobjekte, o.ä.). Globale Systeme, die Zustände verwalten oder übergeordnete Funktionalitäten bieten (klassische Beispiele wären ein Input System oder ein Objekt für die Datenspeicherung), können zum Teil mittels Singletons abgebildet werden. Ansonsten ist es praktisch, Verhaltens- und Kommunikationsmuster einzusetzen (Mediator, Chain of responsibility, Reactor / irgendeine Form von Subscribe-Mechanismen für Middleware). Halte den Kern einfach und lagere verschiedene Tasks (Rendering, Audioausgabe, u.ä.) aus. Z.T. kann man die dann auch auf anderen Threads ausführen lassen.

Fokussiere dich im Anschluss auf die absoluten Grundfunktionalitäten deiner Engine. Dazu gehören zum Beispiel die Datenserialisierung und Objektverwaltung (du brauchst eine Datenstruktur, über die deine Szenenobjekte schnell und einfach zugreifbar sind - z.B. Octtree/Quadtree/R-Tree/Dualgrid), die Ein- und Ausgabeverarbeitung und natürlich auch so etwas wie das Grafikrendering.

Es gibt dazu (und verwandten Themen) natürlich Unmengen an Literatur, Webartikel, Videos, u.ä.. An der Stelle möchte ich zuallererst auf meine Antwort zu dieser damaligen Frage: Wie kann man eine eigene 3D-Game Engine programmieren? verweisen.

Dazu noch ein paar weitere Quellen:

  • Die Game Engine-YouTube Playlist von The Cherno bietet einen Einstieg
  • Make Games Not Engines... to Learn Engines (ein grundsätzlicher Rat, worauf der Fokus beim Bau einer Engine liegen sollte; in meiner oben verlinkten damaligen Antwort habe ich es aber ebenfalls schon etwas angerissen)
  • Im Vercidium Blog findest du ein paar Artikel, in denen die Entwickler der Sector's Edge Game Engine über Strategien/Lösungen zu Problemen, auf die sie gestoßen sind, schreiben
  • Voxely.net (ein kleiner Blog mit Artikeln über den Bau einer Voxel Engine)

Mehr bezogen auf das Grafikrendering:

  • Mastering Graphics Programming with Vulkan von M. Castorina und G. Sassone (Buch)
  • Realtime Renderer Architectures von Alain Galvan (Webartikel)
  • Schau auf GitHub: Es gibt viele Voxel/Game Engine-Projekte, die man sich anschauen kann. Beispiele: SimpleVoxelEngine, WickedEngine, Prototypen (Falcor mit DirectX, Cell mit OpenGL vom Buchautor J. de Vries, eine Demo seitens Microsoft DirectX)
welche bibliotheken für animation,sound,netzwerk,physics

Ich kann im nächsten Abschnitt zwar ein paar bekanntere Optionen benennen, doch ob sie auf dein Vorhaben passen, musst du selbst bestimmen. Es gibt eine Vielzahl an Tools, die jedoch meist noch eigene Fokuspunkte setzen. Das beginnt bei dem grundsätzlichen Support von 2D oder 3D und kann in spezifischere Details gehen (bspw. Physics Engines, die sich konkret auf die Interaktion mit Flugkörpern oder dem Zusammenspiel zwischen Terrain und einem Vehikel spezialisiert haben).

  • Ich denke für die Grafik- und Audioschnittstellen wäre es nicht verkehrt, auf Wrapper/Bibliotheken zurückzugreifen, die die Kommunikation nochmal etwas vereinfachen. Bekannte Tools wären an der Stelle Allegro, raylib, SDL und SFML.
  • Nur für Audio könnten ffMPEG und FMOD für dich interessant sein.
  • Für den Aufbau einer Netzwerkkommunikation eignen sich Boost.Asio, ENet oder yojimbo.
  • Bezüglich Physics kann man sich Box2D, Bullet3, PhysX, ReactPhysics3D oder ODE einmal anschauen.
  • Solltest du zusätzlich vorhaben, die Engine über eine GUI bedienbar zu machen, würde ich für die Umsetzung das Qt-Framework empfehlen. Noch eine andere (funktional schmalere und oft genutzte) Option (die ebenso gut für eine in-game UI genutzt werden könnte), ist Dear ImGui.
Ich schätze mich als relativ erfahrener Entwickler ein aber da ich relativ neu mit c++ in kontakt gekommen bin (...)

Welche tatsächliche (hauptsächliche) Motivation hinter deinem Projekt liegt und welche Komplexität es später abbilden können soll, kann ich nicht beurteilen. Ich gehe durchaus davon aus, dass dir klar ist, dass du nicht einfach so etwas besseres entwickeln kannst, was bestehende Engines (wie die oben genannten) bieten.

Vielleicht ist es also ein reines Hobbyprojekt von dir, bei dem Zeit und Aufwand gar keine Rolle spielen. Vielleicht bist du mit einem Mini-Minecraft-Singleplayer-Laufsimulator bereits vollkommen zufrieden oder aber du möchtest etwas in der Größenordnung von z.B. 7 Days To Die nachbauen. Vielleicht möchtest du damit später kommerziell tätig werden, darüber C++/OpenGL lernen, hattest schon immer Interesse am Bau einer eigenen Engine oder was auch immer.

Du solltest jedenfalls berücksichtigen, dass die Entwicklung einer Game Engine kein gut gewähltes Anfängerprojekt ist. Es wäre hilfreich, schon vorher einmal Software (außerhalb einer Engine, mit eigenen objektorientierten Strukturen) entwickelt zu haben. Zudem kann C++, auch wenn sich die Sprache über die letzten Jahre stark gewandelt hat, eine ziemliche Herausforderung werden. Gerade wenn es darum geht, ein Kernsystem zu entwickeln, bei dem Zeit und Speicherverbrauch eine nicht unwesentliche Rolle spielen. Das ist unter anderem der Grund, wieso ich oben auf Programmbibliotheken verweise, die OpenGL abstrahieren.

Des Weiteren kann es schnell passieren, dass du dich in Themen wiederfindest, die sich immer weiter von der üblichen Spieleentwicklung entfernen. Das passiert unter anderem, sobald du in der Systemprogrammierung weiter hinabsteigst (es wird mathelastiger, OS- und hardwarespezifische Themen werden relevanter) oder falls du beispielsweise vorhast, so wie bei Unity eine GUI zu bauen.

Um ein paar Problemstellungen im Voraus auszuloten, würde ich dir empfehlen, einen Prototyp mit C# und Silk.NET zu entwickeln.


Goeki04 
Beitragsersteller
 22.08.2024, 16:28

Hey, erstmal vielen vielen Dank für deinen ausführlichen Kommentar!

Ich war glaube ich mit meinen Angaben etwas zu unpräzise.

Ich bin was Programmierung angeht schon ziehmlich gut dabei und keinesfalls ein Anfänger. Um paar Projekte zu nennen die ich schon erstellt habe:

-Prozeduale generierung mit Marching Cubes

-Eigener Value Noise und perlin noise generator

-Diverse Shader für Oberflächen

-Berechnungen von Daten auf der GPU mittels Compute shadern (terrain Generation)

- Voxel Ray tracing mit Octrees

All diese Systeme liegen in c# vor und habe ich im laufe der Zeit entwickelt. Das übernehmen dieser Funktionen in c++ sollte nicht allzu lange dauern.

Und um nochmal auf meine Engine spezifisch einzugehen:

Mir ist klar das ich keine krasse engine wie unity oder unreal entwickeln kann aber, das ist auch nicht mein anspruch ich red nicht davon das ich eine Game Engine wie Unity entwickeln möchte (was an sich auch ein autorensystem ist) sondern eine spezifische Engine für mein Voxel basiertes spiele. Das erleichtert schonmal einiges da ich nicht soviele features dafür brauche.

Mein Anspruch ist:

Das ich am Ende ein spiel hab mit (erstmal) lokalem multiplayer. Und einer zufällig generierten welt. Diese zwei sachen stehen im absoluten vordergrund. Ich will diese zwei sachen erstmal soweit optimieren wie ich nur kann. Ich limitiere meine möglichkeiten zwar damit das ich keine grose engine nutze, aber ich finde das macht auch kreativ mit diesen limitationen umzugehen. War ja bei alten spielen früher genauso, die waren auch limitiert in ihrem können. Zwar kann man sagen das diese von mehreren professionellen leuten entwickelt wurden, aber dafür hat man heutzutage das internet mit unzähligen librarys und tutorials etc...

Trotzdem vielen dank für deine Antwort ich werde mir die Bibliotheken in naher zukunft anschauen

0