Ich habe kürzlich mit einem Entity / Component / System-Design gespielt und bin auf ein paar Stolpersteine gestoßen.
Instanz
Nehmen wir an, ich habe ein paar hundert "Dinge" (Asteroiden, Hühner, was auch immer), die mit Instanzen gezeichnet werden. In einer klassischen Komponentenhierarchie hätte ich ein Spielobjekt, das den einzelnen Instanzindex und die Scheitelpunktpuffer sowie den zweiten dynamischen Scheitelpunktpuffer für die Instanzdaten (Sammlung von Matrizen usw.) enthält. Dieses Objekt ist für die Überprüfung von Kollisionen mit anderen Objekten und zwischen den Instanzen selbst verantwortlich.
In einem ES-System möchte ich jede Instanz als einzelne Entität verfolgen, aber ich möchte nicht auf die Einfachheit und Leistung der Instanzierung verzichten. Das erste, was mir einfiel, war das Erstellen einer "Instanzgruppen" -Komponente mit einem Feld, das eine Gruppen-ID definiert, um die Behandlung mehrerer Arten von instanziierter Geometrie zu ermöglichen.
Ein "Instanzsystem" würde diese Komponenten sammeln und den Instanzscheitelpunktpuffer verwalten. Mein Entitätsmanager benachrichtigt Systeme bereits, wenn eine Entität erstellt oder zerstört wird, was die Implementierung dieses Teils ziemlich einfach macht.
Meine Verwirrung kommt davon, wie man das sauber in das Rendering-System integriert. Wenn jede Instanz als separate Entität mit einer "renderbaren" Komponente / einem "renderbaren" Attribut angezeigt wird, werden sie vom Render-System einzeln verarbeitet.
Ich könnte:
Fügen Sie einen Sonderfall für Entitäten hinzu, die sowohl eine "renderbare" als auch eine "instanziierte" Komponente haben, die jedoch chaotisch erscheint und den Weg eines riesigen Render-Systems mit Tonnen von Sonderfällen beschreitet.
Lassen Sie das Render-System eine Sammlung von Instanz-Vertex-Puffern verwalten, die Entitätsliste nach "instanziierten" Entitäten abfragen, anhand einer Gruppen-ID filtern usw. und das entsprechende Rendern durchführen, damit das Render-System für die Verwaltung der Instanz-Sammlungen verantwortlich wird scheint der falsche Ort zu sein, um diese Art von Logik zu formulieren.
Ich könnte auch eine einzelne Entität zusätzlich zu den Instanzen mit beispielsweise einer "InstanceOutput" -Komponente / einem "InstanceOutput" -Attribut und einer
Renderable
Komponente einfügen und dieRenderable
Komponente aus den einzelnen Instanzentitäten entfernen und einen einzelnen Renderpunkt für alle Instanzen angeben. Diese Komponente würde wahrscheinlich auch als Server dienen, um die Geometrie und den persistenten Instanz- / Vertex-Puffer beizubehalten.
Gibt es einen besseren Weg?
Rendern
Ich habe verschiedene Arten von renderbaren Entitäten. Einige haben prozedurale Geometrie und Texturen, andere sind nur Sprites, andere sind Textanzeigen. Was ist der beste Weg, um diese aus Sicht des Renderingsystems zu unterscheiden, ohne eine massive switch
Aussage schreiben zu müssen ? In einer Spielobjekthierarchie hätte jeder dieser Typen seine eigene Draw()
Methode, aber das Verschieben der Logik in ein Render-System scheint nicht viel Flexibilität hinsichtlich verschiedener Effektparameter usw. zu bieten.
quelle
Ich denke, Sie verlieren möglicherweise einen Teil der Leistung der Instanz, wenn Sie jede Instanz zu einer Entität machen. Ich denke, Ihre Idee, eine Instanzgruppe zu verwenden, ist gut. Ich würde dann ein System erstellen, das nach Entitäten mit einer Instanzgruppenkomponente sucht und die Instanzen rendert. Wie andere Systeme kümmert sich dieses System nicht um andere Komponenten der Entität, einschließlich Renderable. Wenn die Entität auch eine renderbare Komponente hätte, die vom entsprechenden System aufgenommen und gerendert würde, aber das Rendern wäre nicht von den Instanzen. Wenn Sie beispielsweise einen Hühnergenerator hätten, würde das Instanzgruppensystem alle Hühner rendern und das renderbare System würde den Hühnergenerator rendern. Sie können ein separates System haben, das die Instanzen innerhalb der Instanzgruppenkomponenten aktualisiert.
Wie für andere Rendering-Sachen. Es wäre einfach, eine
spriteRender
Komponente, einetextRender
Komponente oder eine andere Art von Komponente für jede unterschiedliche Art von Rendering zu erstellen . Dann haben Sie ein System für jede Komponente mit einem anderen Rendering-Stil. Zum Beispiel hat mein Spiel ein Billboard-Rendering-System, ein statisches Modell-Rendering-System und ein animiertes Modell-Rendering-System. Eine Entität kann alle oder eine beliebige Kombination haben. Zum Beispiel könnte ein Kobold eine animierte Modellkomponente für seinen Körper und eine Werbetafelkomponente für ein Statussymbol über seinem Kopf haben.quelle