Game Engine Framework oder Bibliothek [geschlossen]

8

Ich bin in der Planungsphase für eine interne Spiel-Engine, die ich in Kürze erstellen werde und die in Zukunft für alle meine Spiele verwendet wird. Aber ich habe ein bisschen Probleme damit, wie es gebaut werden soll.

Die Auswahlmöglichkeiten sind: Framework oder Bibliothek.

Mein grundlegendes Ziel ist es, Engine-Details so weit wie möglich zu verbergen, um die Spieleentwicklung auf hohem Niveau für Skripte und Konfigurationsdateien so weit wie möglich aufrechtzuerhalten. Aber auch, um die Core Engine für alle Tools wiederzuverwenden, die wir in Zukunft entwickeln könnten.

Frameworks können die Entwicklung angenehm und einfach gestalten, aber dann sind Sie eingesperrt. Bibliotheken sind gut, wenn Sie nur an einem bestimmten Subsystem interessiert sind. Aber wir müssen alles Spiel für Spiel zusammenkleben.

Nun, es gibt noch eine andere, die die Engine als eigenständige Exe baut, die alle Spielressourcen und alle Subsysteme verwaltet. Die Spielelogik (und andere dynamische Dinge pro Spiel) wird ausschließlich für Skripte mit Konfigurationsdateien ausgeführt, um jedes interne Engine-Subsystem zu konfigurieren.

Welches wird mir in Zukunft mehr Flexibilität geben.

Vielen Dank.

Edit: Danke an alle, ich schätze, ich habe das aus der falschen Perspektive gesehen. Wir können so etwas nicht wirklich planen, ohne vorher zu wissen, was die Spiele brauchen. Vermutlich gibt es deshalb keine allgemeine Engine für alle Genres.

Ich werde mich zuerst auf das eigentliche Spiel konzentrieren und dann am Ende jedes Spiels iterativ analysieren, wie je nach Arbeitsablauf (oder möglicherweise dem eines zukünftigen Teams) anständige Abstraktionen für Bibliotheken oder Frameworks erstellt werden können.

Daemoniorum
quelle
3
Weder. Sie sollten das Spiel bauen, nicht die Engine.
5ound
Genau. "Frameworks können die Entwicklung angenehm und einfach gestalten, aber dann sind Sie eingesperrt." Ich denke, Sie sperren sich tatsächlich aus. :) Spiele bauen, keine Engines. Motoren werden später folgen - viel später. Es entstehen mehrere Projekte.
Jacmoe
@Jacmoe: Entweder das oder du versuchst dein nächstes Spiel auf deinem vorherigen Spiel aufzubauen und die Quelle ist mit unstrukturiertem Code gefüllt, mit dem es unglaublich schwierig ist zu arbeiten. Im Laufe der Zeit könnten Sie eine enorme technische Verschuldung aufbauen, die schließlich zu einem bestimmten Punkt führen wird, an dem Sie mit diesem Code überhaupt nichts mehr entwickeln können. Ich sage nicht, dass es passieren wird, aber es könnte :)
Simon
Ich habe nicht empfohlen, unstrukturierten Code zu erstellen. :) Das Erstellen eines Spiels anstelle einer Engine ist nicht gleichbedeutend mit dem Erstellen eines Chaos - nicht immer ..
Jacmoe

Antworten:

15

Mach dir noch keine Sorgen um die Zukunft. Sorgen Sie sich jetzt um Ihr aktuelles Spiel. Andernfalls kommen Sie nicht weiter, weil Sie sich über die Details ärgern.

Sie sollten sich zuerst darauf konzentrieren, das Spiel zu erstellen, und später, wenn das Spiel erfolgreich genug war, können Sie es in etwas extrahieren, das für Ihr nächstes Spiel wiederverwendbar ist. Dies verhindert, dass Sie an etwas anderes gebunden sind, und gibt Ihnen die volle Kontrolle über Ihr Projekt.

Bryan Denny
quelle
10

Erstellen Sie ein Framework.

Ich habe Erfahrung mit dem Bau von beidem. Ich bevorzuge Bibliotheken gegenüber Frameworks. Frameworks fühlen sich sehr restriktiv und "herrisch" an . Als ich mein erstes Spiel baute, wollte ich eine Engine bauen, die aus vielen Bibliotheken bestand, die leicht in anderen Projekten wiederverwendet werden konnten.

Es war ein Disaster. Ich habe die Hälfte meiner Zeit damit verbracht, Klebercode zwischen meinen verschiedenen Bibliotheken zu schreiben. Meine Bibliotheken neigten auch dazu, mit zusätzlichen Abstraktionen aufgebläht zu werden, so dass es eine große Aufgabe wurde, den Bibliotheken / Komponenten Funktionen hinzuzufügen.

Jetzt sind meine Engines jedoch auf das Spiel ausgelegt, das ich gerade schreibe. Ich halte immer noch die Augen offen für Abstraktionen, die es mir ermöglichen, sie oder die neuen Funktionen, die ich in späteren Spielen hinzufüge, wiederzuverwenden. Ich bin viel glücklicher und produktiver.

Für mich war der Wendepunkt die Entscheidung, meinen Motor nicht zu veröffentlichen. Ich kann es zwar noch veröffentlichen, aber im Moment weiß ich, dass ich meine spielspezifischen Hacks nicht gegenüber anderen Benutzern rechtfertigen muss, und habe eine Engine entwickelt, die besser zu meinen Spielen passt.

deft_code
quelle
5
+1 darauf. Tatsächlich denke ich, man sollte sich auf das Schreiben Ihres Spiels konzentrieren und nicht auf eine Engine, um ein Spiel zu schreiben. Nach mehreren erfolgreich abgeschlossenen Spielen entsteht eine Engine. Lesen Sie dies: Scientificninja.com/blog/write-games-not-engines Zu viele Projekte sterben früh, weil sie versucht haben, eine generische Mutter aller Motoren zu schreiben.
Jacmoe
4

Ich sehe das zu oft.
Warum eine Engine für zukünftige Spiele bauen, wenn Sie nicht wissen, welche Spiele benötigt werden?
Warum nicht zuerst das Spiel erstellen und dann noch eines und noch eines, das so oft wie möglich wiederverwendet wird?
Dann haben Sie eine Codebibliothek, wahrscheinlich unorganisiert, aber alle haben sich als nützlich erwiesen.
Dann können Sie es organisieren.

Und für 'Framework vs Library' würde ich mich darauf stützen, wie müde Sie werden, immer und immer wieder eine Spieleschleife zu schreiben. ;)

Ein Framework muss Sie nicht unbedingt einschließen. Schauen Sie sich XNA an.

Die kommunistische Ente
quelle
Wollen Sie damit sagen, dass XNA Sie nicht einschließt? Das ist ziemlich genau das, was es tut.
Jsimmons
Ich kann nicht sehen, wie es dich wirklich einschließt. Möchtest du es erklären?
Die kommunistische Ente
4

Halte es einfach.

Wenn Sie sich nicht sicher sind, welchen Weg Sie gehen sollen, tun Sie einfach, was Ihr Spiel erfordert. Versuchen Sie, kleine, grundlegende Bibliotheken für Dinge zu schreiben, von denen Sie glauben, dass sie in Zukunft verwendet werden können. Informieren Sie sich über datengesteuerte Softwareentwicklung. Ich schlage vor, sich mit komponentenbasierten Entitätssystemen zu befassen. Basieren Sie den Code nicht auf einzigartigen Dingen wie einem Spieler. Ein Spieler ist nur ein anderes Objekt, genau wie alles andere. Eine Entität hat Komponenten, möglicherweise eine Liste von Komponenten.

Indem Sie kleine, enthaltene Bibliotheken schreiben, die miteinander interagieren, können Sie festlegen, welche für Ihr nächstes Spiel wiederverwendet werden sollen. Persönlich habe ich Dinge wie eine "Container" -Bibliothek für Datenspeichertypen. Ich habe eine Mathematikbibliothek für solche Dinge. Es gibt verschiedene Dinge wie diese, die Sie als Module sortieren und schreiben können. Kamera, Effekte, Eingabe, Entität, Bewegung, Physik, Rendering, Ressourcenhandhabung, Threading, die Liste geht weiter.

Das Schreiben kleiner eigenständiger Komponenten erhöht häufig die Lesbarkeit und die Debugging-Möglichkeiten Ihres Codes.

Mike Acton und Insomniac Games (www.insomniacgames.com) haben viele Themen und Diskussionen zur Spieleentwicklung geschrieben, insbesondere datengesteuert. Schauen Sie nach und finden Sie heraus, welche Informationen zu komplex sind und welche Sie interessant und verständlich finden. Sie sind großartige Entwickler mit einer Menge Erfahrung.

Simon
quelle
Yay Insomniac Games! Eines ihrer Büros befindet sich in meiner Nähe in Durham, NC, und einige Mitarbeiter haben im vergangenen Frühjahr auf der Triangle Game Conference großartige Vorträge gehalten.
Ricket
Ich habe mich ein bisschen mit datengetriebener Entwicklung beschäftigt und werde sie sicherlich nutzen. Was Komponenten betrifft, werde ich es überprüfen, insbesondere weil ich mit dem "funktionalen" Ansatz, den ich gerade mache, nicht ganz zufrieden bin.
Daemoniorum
@Daemoniorum: Hört sich gut an, werfen Sie mir einfach einen weiteren Kommentar, wenn Sie weitere Fragen haben oder Hilfe / Ideen für Implementierungen benötigen.
Simon
3

Ich denke, Sie machen eine vorzeitige Verallgemeinerung. Bleiben Sie jetzt nicht zu sehr bei zukünftigen Fragen hängen. Wählen Sie eine Antwort und laufen Sie damit, lernen Sie daraus. Wirf eine Münze, wenn du keine Präferenz hast.

Beginnen Sie mit dem Erstellen eines Spiels. Wenn Sie Ihr zweites Spiel erstellen, haben Sie eine bessere Vorstellung davon, welche Teile wiederverwendbar sind und in robuste Bibliotheksfunktionen umgewandelt werden können. Wenn Sie Ihr drittes Spiel erstellen, haben Sie eine bessere Vorstellung davon, welche Struktur wiederverwendbar ist und in ein robustes Framework umgewandelt werden kann.

grau
quelle
2

In Bezug auf Flexibilität denke ich, dass Sie Ihre eigene Frage beantwortet haben: "Frameworks können die Entwicklung schön und einfach machen, aber dann sind Sie eingesperrt ." Dies bedeutet nicht, dass Frameworks unflexibel sein müssen. Jedes Spiel hat zum Beispiel eine Spielschleife. Microsofts XNA Framework ist 99% Bibliothek, aber Ihr Spiel erweitert die Spielklasse , die nur ein paar leeren Funktionen für die Dinge bietet , die in jedem Spiel sind garantiert: LoadContent, Update, Draw. Es ist ein Paradebeispiel für einen nicht einschränkenden Rahmen.

Man könnte sagen, ein Framework ist nichts anderes als eine Bibliothek, die mit einer oder mehreren Vorlagenklassen kombiniert ist, die in die Bibliothek eingebunden sind. Zumindest war dies meine Erfahrung.

Ich bevorzuge Bibliotheken gegenüber Frameworks. jMonkeyEngine zum Beispiel ist großartig, aber es ist ein Framework, und als Ergebnis habe ich festgestellt, dass es Tonnen von Flak erhält. SDL hingegen ist erstaunlich beliebt. Es ist nur eine Bibliothek. Es bietet das, was Sie brauchen, tut aber alles, um damit zu tun, was Sie wollen.

Bei einer Bibliothek muss nicht unbedingt viel Spiel für Spiel geklebt werden - insbesondere, wenn Sie Teile Ihrer Bibliothek schreiben, um jeden Teil der Spielschleife zu unterstützen. Ein Frames-Per-Second-Timer / Zähler würde beispielsweise verhindern, dass dieser häufig neu geschriebene Teil bei jedem Spiel neu erfunden werden muss.

Außerdem können Bibliotheken so allgemein oder spezifisch sein, wie Sie sie erstellen möchten. Wenn Sie ein Rennspiel erstellen und möchten, dass Ihre Bibliothek rennspezifische Funktionen bietet, ist das in Ordnung. Es ist Ihre Kreation und Sie können genau auswählen, wie flexibel Sie es möchten. Dies wäre in einer Situation sehr machbar, in der Sie einen langfristigen Vertrag mit Nascar haben, um beispielsweise zahlreiche Rennspiele zu entwickeln. Sie möchten nicht unbedingt, dass ein Framework Sie möglicherweise in ein klassisches Rennspiel einbindet, wenn Nascar auftaucht und nach einem Offroad-Spiel fragt, aber Sie möchten eine rennspielspezifische Bibliothek, da Sie wissen, dass Nascar nicht ist Ich werde nicht nach einem Schützen fragen.

Hier ist auch ein Tipp für die Entwicklung: Wenn Sie die Bibliothek neben einem Spiel schreiben, wird die Bibliothek unweigerlich versehentlich mit dem Spiel gekoppelt oder zu unflexibel, egal wie viel Sie planen. Sie werden es herausfinden, sobald Sie versuchen, ein anderes Spiel daraus zu machen, und Sie werden Zeit damit verbringen, es zu trennen. Dies ist nicht unbedingt eine schlechte Sache, und Sie könnten sich bewusst dafür entscheiden, da Sie nach der Veröffentlichung Ihres ersten Spiels mehr Freizeit haben. Wenn Sie jedoch von Anfang an eine herausragende Bibliothek anstreben, versuchen Sie, zwei völlig unterschiedliche Spiele gleichzeitig zu erstellen, und extrahieren Sie die ähnlichen Teile in Ihre Bibliothek. Sie werden viel weniger Kopplung erhalten, es wird viel flexibler sein und Ihr drittes Spiel wird wahrscheinlich immer noch einige Schwächen aufdecken, aber Ihre Bibliothek wird am Ende viel besser sein. Es ist jedoch offensichtlich viel schwieriger und zeitaufwändiger.

Ricket
quelle