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.