Game Engine mit OpenGL von Grund auf neu schreiben [closed]

14

Ich möchte meine Spiele-Engine von Grund auf neu schreiben, um sie zu lernen. Was sind die Voraussetzungen und wie kann ich das tun? Welche Programmiersprachen und Dinge empfehlen Sie mir? Auch wenn Sie gute Artikel und Bücher darüber haben, wird es großartig sein. Danke im Voraus!

Meine Programmiersprachen und Tools sind:

  • C / C ++ ist es gut, nur C zu verwenden?
  • Python
  • OpenGL
  • Git
  • GDB

Was ich daraus lernen möchte:

  • Core Game Engine
  • Rendering / Grafik
  • Spielablauf / Regeln
  • Eingabe (Tastatur / Maus / Controller usw.)

Im Rendering / Grafik:

  • 3D
  • Schattierung
  • Beleuchtung
  • Texturierung
Wazery
quelle
Zwei Punkte: Diese Frage ist zu weit gefasst. Welche Funktionen möchten Sie, welche Plattformen möchten Sie unterstützen, welche Paradigmen möchten Sie untersuchen, wie viel Verantwortung Sie für eine Skriptsprache übernehmen möchten (falls vorhanden) und eine ganze Reihe anderer Dinge, die ich Ich werde mich nicht die Mühe machen, weiterhin aufzulisten.
Tetrad
8
Zweitens: Es gibt die gängige Meinung, dass andere Leute sagen, dass Sie sich nicht darauf konzentrieren sollten, eine Engine ohne Spiel zu bauen. Eine Engine ohne Spiel bedeutet, dass Sie nicht beweisen können, dass Ihre Engine nützlich ist . Bei guten Motoren muss man sozusagen sein eigenes Hundefutter essen. Ein häufig verlinkter Blog, der mehr über dieses Argument berichtet, ist hier: scientificninja.com/blog/write-games-not-engines
Tetrad
2
^ Nicht nur das, sondern das Schreiben einer Engine ohne Spiel, um die Featureanforderungen zu motivieren, führt zu Feature-Creep und schlechtem API-Design. Solange Sie nicht wissen, was Sie brauchen, und dies nicht durch die Spielanforderungen angedeutet ist, können Sie möglicherweise keine nützlichen Dinge in Ihre Engine integrieren. Aus dem gleichen Grund, wenn Sie die Engine nicht zum Programmieren verwenden mussten, könnten Sie einige Ihrer Entscheidungen als sehr klobig empfinden.
ChrisE
1
Ich sehe den Punkt nicht in Ihren Auflistungen. Die Tatsache, dass Sie C / C ++ und Python kennen, hilft uns, aber warum sollten Sie angeben, dass Sie die Versionskontrolle und einen Debugger verwenden können?
Die kommunistische Ente
2
@TheCommunistDuck: Hey, das ist besser als manche Entwickler. :)
ChrisE

Antworten:

11

Sie können eine Game-Engine in praktisch jeder Sprache mit praktisch jeder Rendering-Methode schreiben. Sie können eine Game-Engine in Bash schreiben, indem Sie beispielsweise die Konsolenausgabe verwenden.

Ich denke, es ist am besten zu definieren, was genau Sie lernen möchten, wenn Sie Ihre eigene Engine schreiben. Es gibt viele "Felder" in der Spieleentwicklung.

  • Core Game Engine

  • Rendering / Grafik

  • AI

  • Vernetzung

  • Spielablauf / Regeln

  • Klang

  • Eingabe (Tastatur / Maus / Controller usw.)

etc .. Von dort können Sie sogar Unterthemen haben. In Rendering / Grafik

  • 2D oder 3D?

  • Modellieren

  • Schattierung

  • Beleuchtung

  • Texturierung

  • GUIs / Huds / Interfaces.

  • etc, etc

Nur eines dieser Unterthemen könnte viele Stunden (oder Jahre!) Des Studiums kosten!

Definieren Sie also zunächst, was Sie lernen möchten. Einfach anfangen.

Verwenden Sie die Sprache, mit der Sie sich auskennen - obwohl einige für bestimmte Aufgaben besser geeignet sind. Die Core-Engine und das Rendering lassen sich wahrscheinlich am besten mit einer "niedrigeren" Sprache wie C / C ++ ausführen (wenn Sie also Leistung benötigen). Aber so etwas wie KI oder Spielregeln könnte besser in einer höheren Sprache gemacht werden. Nichts sagt, dass Sie nicht mischen und zusammenpassen können. Sie könnten Ihre Engine in C ++ schreiben, Ihr Rendering in C (da es gut mit OpenGL funktioniert) und dann LUA zum Skripten Ihrer Spielregeln usw. verwenden.

Zum Beispiel gibt es eine Game-Engine namens Slick2D. Es ist in Java geschrieben und Open Source. Es ist ein Beispiel für eine einfache 2D-Engine, die wirklich gut geschrieben und entworfen wurde. Daraus können Sie grundlegende Konzepte lernen, wie z. B. Spielschleifen, Verwalten von Spielzuständen usw.

Wenn Sie mit C / C ++ vertraut sind; Ich würde vorschlagen, einen Blick auf SDL / OpenGL zu werfen. Es kümmert sich um einige Dinge wie Eingabe, Sound, Erstellen von Fenstern usw. und kann sich auf andere Dinge konzentrieren.

user697111
quelle
4
Ahh die Tage, als ich C ++ und Konsolenspiele lernte, waren ein unglaublicher Spaß ... [erstellt neues Konsolenprojekt ...]
Nick Bedford
Ich habe meine Frage aktualisiert und hoffe, dass ich viele tolle Ressourcen habe :)
Wazery
3

SDL + OpenGL ist eine hervorragende Wahl, um eine benutzerdefinierte Game-Engine zu starten.

Ich persönlich benutze eine C-ish-Version von C ++, weil ich herausgefunden habe, dass das für mich am besten funktioniert. Damit meine ich, ich benutze keine Ausnahmen. Dafür gibt es zwei Gründe: Zuallererst erfordern Ausnahmen ausnahmesicheren Code, der mit OpenGL und SDL nicht ganz einfach zu erreichen ist. Noch wichtiger ist jedoch, dass es auf diese Weise sehr einfach ist, C ++ - Objekte über C ABI verfügbar zu machen. Dies ist unglaublich hilfreich, wenn Sie versuchen, eine Skriptsprache in die Mischung aufzunehmen.

Ich bin in einem ähnlichen Boot wie Sie und habe einige meiner Abenteuer mit SDL und OpenGL in einem Blog ( immersedcode.org ) niedergeschrieben, falls jemand anderes daran interessiert ist.

Für die allgemeine Architektur habe ich zwei Vorschläge: Wenn Sie eine 3D-Engine möchten, lesen Sie das Buch "Game Engine Architecture" von Jason Lander. Wenn Sie nur 2D möchten, gestalten Sie das Design so einfach wie möglich und lassen Sie sich von XNA oder anderen Projekten inspirieren.

Zuletzt: Rufen Sie nicht überall OpenGL an. Tun Sie sich selbst einen Gefallen und isolieren Sie ihn an mehreren Stellen, damit Sie zu einem späteren Zeitpunkt zwischen Desktop OpenGL / OpenGL ES oder sogar DirectX wechseln können, wenn Sie dies möchten.

Armin Ronacher
quelle
0

Verwenden Sie C nur, wenn Sie von einem Implementierungsdetail mit vorgehaltener Waffe dazu aufgefordert werden. Verwenden Sie andernfalls C ++, da es eine weitaus leistungsfähigere Sprache ist und Sie diese Funktionen später immer noch nicht verwenden können. Ich persönlich habe nichts für / gegen Python, ich habe es nie benutzt.

Ich würde OpenGL nicht gegen DirectX empfehlen, da DX einen modernen objektorientierten Ansatz hat, der weitaus sauberer und verständlicher / weniger fehleranfällig ist. Die von OpenGL angebotene Schnittstelle ist im Vergleich extrem schlecht.

Das Letzte, was ich habe, ist, dass ich von vielen Leuten gehört habe, denen ich vertraue, dass GDB absolut zum Kotzen ist und der Visual Studio-Debugger bei weitem der beste ist. Dies ist nicht meine persönliche Erfahrung, nehmen Sie es mit ein wenig Salz.

DeadMG
quelle
4
"OpenGL vs. DX". Die Tatsache, dass DirectX mehr OO ist, ist nicht wirklich wichtig. Soweit es verständlicher ist ... OpenGL (vor 3) bietet eine recht unkomplizierte Benutzeroberfläche, die einfach zu scannen ist, da es sich um eine imperative C-Methodik handelt. "Stellen Sie die Projektionsmatrix darauf ein. Startdreiecke. Hier ist ein Vert. Hier ist ein Vert. Hier ist ein Vert. Enddreiecke." Die 1.x-Serie von OpenGL-APIs ist gut, um Ihre Füße in der Grafikprogrammierung nass zu machen, und in Kombination mit SDL (oder sogar GLUT ... urg) können Sie eine App in etwa 30-50 Codezeilen erstellen.
ChrisE
2
@ ChrisE: Sicher. Es gibt etwas extern "C", das so genannt wird , und seine angemessene Verwendung macht das Schreiben einer C-Schnittstelle eher trivial - insbesondere für Python, wo in Boost ein Konverter vorhanden ist, der das Binden erleichtert. Wie wäre es mit C ++ - Sprachfunktionen? Sie sind großartig . Die stärkere Verwendung der Sprachfunktionen von C ++ erhöht die Zuverlässigkeit eines Projekts und erleichtert das Codieren massiv, was zu einem mehr als akzeptablen, sehr geringen Leistungsverlust führt. Die Sprachmerkmale von C sind im Vergleich erbärmlich. Beispielsweise kann die korrekte Verwendung eines modernen C ++ - Compilers keine Speicherverluste garantieren . Tun Sie das in C.
DeadMG
1
@DeadMG: Wenn OOP auch wirklich eine große Sache war, lautet die Antwort hier Java oder C # und nicht C ++. Das, womit ich nicht einverstanden bin, ist, dass die Verwendung von C ++ - Funktionen Ihren Code nicht auf magische Weise verbessert, beschleunigt oder sogar zuverlässiger macht. Sie müssen wissen, wie man diese Funktionen verwendet, und ist das Erlernen einer Sprache neben dem Entwickeln einer Engine wirklich ein guter Zeitgewinn? Nein, nicht für jemanden, der dies zum ersten Mal tut. Sie können in ein oder zwei Tagen ganz bequem C lernen und wundern sich nie, was die Sprache tut. OpenGL, jedenfalls das nützliche Basisanrufset, bietet die gleiche Transparenz.
ChrisE
2
OOP ist keine so große Sache, nicht in Hochleistungs-Game-Engines. Sicher ist es nützlich, aber es ist oft die falsche Abstraktion. Ein guter Datenfluss, eine gute Lokalität und ein gutes Speicherlayout sind normalerweise besser. Während viele Teams C ++ verwenden, verwenden sie nicht die meisten C ++ - Funktionen. Keine Ausnahmen, möglichst wenig Virtuals, kein RTTI, kein STL / Boost. Warum? Vorhersehbare und schnelle Ausführung und kleiner Code auf mehreren Plattformen. Ich codiere in C und es gibt nur zwei Bereiche, in denen ich lieber C ++ verwenden würde: Sperren mit Gültigkeitsbereich und generische Arrays. Lohnt sich nicht die Mühe IMHO.
ungültig
4
Bei GL vs. D3D: Es gibt keinen Matrixstapel im GL3 / 4-Kern und keinen Attributstapel. Sowohl GL als auch D3D ordnen sich derselben Hardwarearchitektur zu, aber viel Zeit, in der sich GL dünner anfühlt. Sicher, die GL-Zustandsmaschine ist ein bisschen umständlich, aber auch die eigentliche Hardware. Es ist in Ordnung, eine davon zu erlernen. Solange Sie verstehen, was tatsächlich passiert, können Sie problemlos auf die andere (oder eine Konsolen-API) wechseln.
ungültig