Ich habe ein paar Bücher über Entwurfsmuster und habe einige Artikel gelesen, kann aber nicht intuitiv herausfinden, welche Entwurfsmuster für die Entwicklung von Spielen nützlich sind.
Ich habe beispielsweise ein Buch mit dem Namen ActionScript 3 mit Entwurfsmustern, in dem verschiedene Entwurfsmuster wie Model View Controller, Singleton, Factory, Command usw. beschrieben sind.
Als Neueinsteiger kann ich nicht herausfinden, welches von diesen nützlich sein würde, oder tatsächlich, ob eines von diesen die Entwurfsmuster sind, die ich lernen und zu verwenden versuchen sollte. Vielleicht gibt es andere, spielprogrammspezifischere Designmuster, die mir nicht einmal bewusst sind?
Wenn Sie Erfahrung mit einem bestimmten Designmuster in der Spieleentwicklung haben, würde ich es gerne hören. Das Begründen, warum es verwendet wurde, Codebeispiele oder Online-Ressourcen wären ebenfalls sehr hilfreich, wenn Sie sie haben. Momentan interessiere ich mich am meisten für ActionScript 3 und C ++ Implementierungen, könnte aber definitiv von Erfahrungen und Beispielen aus jeder Sprache profitieren.
Vielen Dank!
Antworten:
Nun zu einer weniger flippigen Antwort mit einigen Vorschlägen. Nehmen Sie diese nicht als Implementierungsempfehlungen, sondern als Beispiele für eine mögliche Verwendung.
Einige Muster wurden aufgrund mangelnder Inspiration ausgelassen.
quelle
Ich habe genau zu diesem Thema ein Buch geschrieben: Game Programming Patterns . Die darin enthaltenen Kapitel könnten für Sie hilfreich sein.
quelle
Eine Sache, die Brandon Eich mit Coders at Work hatte, ist, dass Muster Hacks und Workarounds sind: [Patterns] zeigen eine Art von Defekt in der Sprache. Diese Muster sind nicht frei. Es gibt kein kostenloses Mittagessen. Wir sollten also nach der Evolution in der Sprache suchen, die die richtigen Elemente hinzufügt.
Als Spieleprogrammierer haben wir selten die Möglichkeit, die von uns verwendeten Sprachen weiterzuentwickeln, aber wir können lernen, unseren eigenen Stil weiterzuentwickeln, um unsere Sprache und Anforderungen besser zu erfüllen. Muster sind ein Teil davon, aber das Nicht-Verwenden von Mustern ist ein anderer Teil, zumal, wie Brandon sagt, Muster selten ohne nennenswerte Kosten für Leistung, Speicher oder Code-Agilität auskommen. MVC ist einfach kein großartiges Muster für viele Dinge in Spielen. Singleton ist eine Problemumgehung für statische C ++ - Initialisierungsregeln, die Sie wahrscheinlich sowieso nicht ausführen sollten. Factory vereinfacht die Erstellung komplizierter Objekte - vielleicht sollten Ihre Objekte zunächst einfacher sein. Die gängigen Muster sind Werkzeuge, auf die wir zurückgreifen können, wenn wir sie brauchen Um etwas Komplexes zu managen, sollten wir uns nicht danach sehnen, am Anfang etwas Komplexes zu bauen.
Guter (Spiel-) Code verwendet möglicherweise Muster oder nicht. Wenn es Muster verwendet, sind sie ein großartiges Kommunikationswerkzeug, um anderen Programmierern die Codestruktur auf einer hohen, sprachunabhängigen Ebene zu erklären. Wenn Sie der Meinung sind, dass der Code besser ist, ohne ein Muster zu verwenden, schlagen Sie sich nicht darüber hinweg - wahrscheinlich ist es das auch.
quelle
Natürlich sind, wie andere gesagt haben, alle Muster unter den richtigen Umständen nützlich, und ein Teil des Lernens, wie man sie verwendet, besteht darin, zu lernen, wann man sie verwendet. Das ausgezeichnete Buch Core Techniques and Algorithms in Game Programming von Daniel Sanchez-Crespo Dalmau listet jedoch sechs Programmiermuster und sechs Usability-Muster als besonders nützlich für die Spielprogrammierung auf.
Programmierung:
Benutzerfreundlichkeit:
Das Buch geht natürlich detaillierter auf diese ein.
quelle
Entitätssysteme sind eine nette Art von Muster. Es ist nicht gerade ein Entwurfsmuster, da es kein strenges OOP ist. Sie können es jedoch mit OOP mischen.
Einige gute Links (Start von oben für Intro):
quelle
OOP design patterns
solche, die normalerweise Beziehungen und Interaktionen zwischen Klassen / Objekten zeigen. Und es gibt viele andere Designmuster. OOP ist eine Reihe von Konzepten, nicht wirklich ein Muster.Design pattern
ist auch ein Konzept.Alle von ihnen. Außer Singleton. [/Leichtfertigkeit]
quelle
Nicht wirklich über Muster, sondern über Grundprinzipien dahinter. In "Design Patterns: Elemente wiederverwendbarer objektorientierter Software" (1995 ) empfiehlt die vierköpfige Gruppe (Gamma, Erich; Richard Helm, Ralph Johnson und John Vlissides) nur zwei Prinzipien für das objektorientierte Design: (1) program to eine Schnittstelle und nicht zu einer Implementierung und (2) bevorzugen die Objektzusammensetzung gegenüber der Klassenvererbung.
Diese beiden Prinzipien sind bei vielen Aufgaben der Spieleentwicklung sehr hilfreich. Beispielsweise haben viele Spielprogrammierer eine tiefe Klassenhierarchie verwendet , um Spieleinheiten darzustellen. Es gibt einen anderen Ansatz, der auf Komposition basiert - komponentenbasierte Spielobjekte. Artikel über diesen Ansatz. Noch mehr Links . Dies ist ein Beispiel für ein Decorator-Muster .
quelle
Das seltsamerweise wiederkehrende Vorlagenmuster kann sehr nützlich sein, um virtuelle Methoden und die Leistungseinbußen zu vermeiden, die durch die virtuellen Funktionsaufrufe verursacht werden können.
Dies kann das geeignete Muster sein, wenn Sie keinen Container des Basisklassentyps mit der von Ihnen gewünschten Schnittstelle benötigen, aber ähnlich benannte Verhalten und Schnittstellen möchten.
Sie können dies beispielsweise zum Kompilieren von Klassen für mehrere Plattformen oder Engines (dx vs. opengl) verwenden, bei denen die Varianz des Typs zum Kompilierungszeitpunkt bekannt ist.
quelle
Ein Entwurfsmuster, das ich über viele Jahre hinweg entwickelt habe und das mir auf spektakuläre Weise nützlich war, bezeichne ich als "vermittelte Definitionssätze". Wie man es in GOF-Begriffen zusammenfasst, scheint umstritten zu sein, aber diese Frage, die ich darüber auf StackOverflow schrieb, geht ins Detail.
Das Kernkonzept besteht darin, dass eine Eigenschaft eines Modells, wie die Spezies einer Kreatur, so eingerichtet wird, dass jeder mögliche Wert für die Eigenschaft ein entsprechendes Definitionsobjekt hat - ein einzelnes gemeinsames Objekt pro Wert -, das sein Verhalten festlegt. und auf diese wird über einen zentralen Broker zugegriffen (der in Bezug auf GOF eine Registry, eine Factory oder beides sein kann). In meiner Verwendung wird im Allgemeinen auch über skalare Schlüssel auf sie zugegriffen, um eine schwache Bindung für Laufzeitmorphismuszwecke zu ermöglichen.
quelle