Ich erstelle ein komponentenbasiertes Spielobjektsystem . Einige Hinweise:
GameObject
ist einfach eine Liste vonComponents
.- Es gibt
GameSubsystems
. Zum Beispiel Rendering, Physik usw. JedesGameSubsystem
enthält Zeiger auf einige vonComponents
.GameSubsystem
ist eine sehr mächtige und flexible Abstraktion: Sie repräsentiert jeden Teil (oder Aspekt) der Spielwelt.
Es besteht ein Bedarf in einem Mechanismus der Registrierung Components
in GameSubsystems
(wenn GameObject
erstellt und zusammengesetzt). Es gibt 4 Ansätze :
- 1: Muster der Verantwortungskette . Jeder
Component
wird jedem angebotenGameSubsystem
.GameSubsystem
trifft eine Entscheidung, welcheComponents
registriert werden soll (und wie sie organisiert werden sollen). Beispielsweise kann GameSubsystemRender renderbare Komponenten registrieren.
Profi. Components
weiß nichts darüber, wie sie verwendet werden. Niedrige Kopplung. A. Wir können neue hinzufügen GameSubsystem
. Fügen wir beispielsweise GameSubsystemTitles hinzu, das alle ComponentTitle registriert und garantiert, dass jeder Titel eindeutig ist und eine Schnittstelle zum Abfragen von Objekten nach Titel bietet. Natürlich sollte ComponentTitle in diesem Fall nicht neu geschrieben oder vererbt werden. B. Wir können bestehende neu organisieren GameSubsystems
. Beispielsweise können GameSubsystemAudio, GameSubsystemRender und GameSubsystemParticleEmmiter in GameSubsystemSpatial zusammengeführt werden (um alle Audiodaten, Emmiter, Rendering Components
in derselben Hierarchie zu platzieren und übergeordnete relative Transformationen zu verwenden).
con. Jeder Scheck. Sehr ineffizient.
con. Subsystems
wissen über Components
.
- 2: Jeder
Subsystem
sucht nachComponents
bestimmten Typen.
Profi. Bessere Leistung als inApproach 1
.
con. Subsystems
noch wissen über Components
.
- 3:
Component
registriert sich inGameSubsystem(s)
. Wir wissen zur Kompilierungszeit, dass es einen GameSubsystemRenderer gibt. Lassen Sie uns also ComponentImageRender so etwas wie GameSubsystemRenderer :: register (ComponentRenderBase *) aufrufen.
Profi. Performance. Keine unnötigen Überprüfungen wie inApproach 1
.
con. Components
sind schlecht gekoppelt mit GameSubsystems
.
- 4: Mediatormuster .
GameState
(das enthältGameSubsystems
) kann registerComponent (Component *) implementieren.
Profi. Components
undGameSubystems
nichts voneinander wissen.
con. In C ++ würde es wie ein hässlicher und langsamer Typeid-Switch aussehen.
Fragen:
Welcher Ansatz ist besser und wird hauptsächlich im komponentenbasierten Design verwendet? Welche Praxis sagt? Anregungen zur Umsetzung vonApproach 4
?
Vielen Dank.
quelle
Components
inGameObjects
ist nicht Gegenstand meiner Frage. Lesen Sie Artikel über komponentenbasierte Ansätze oder stellen Sie auf dieser Website eigene Fragen, wenn Sie daran interessiert sind. Was Sie denken,GameSubsystem
ist völlig falsch.Antworten:
Tür Nummer 3 ... Komponente registriert sich in GameSubsystem (s)
Die Komponente ist vorhanden, um die Kopplung vom GameObject selbst zu abstrahieren. Irgendwie muss tatsächlich irgendwo etwas mit den Subsystemen interagieren, und dies ist die Komponente und ihr Zweck.
Die Kopplung ist in diesem Fall eigentlich keine schlechte Sache.
Die Leistung ist in diesem Fall im Wesentlichen erforderlich , wenn Sie eine Komplexität in Ihrem System erwarten, können Sie sich die Suchstilansätze der anderen Optionen einfach nicht leisten.
Wenn ein Subsystem auf ein anderes reagieren muss (Renderer, Physik, Audio müssen alle Dinge tun, wenn etwas passiert), können die Komponenten dies durch das Spielobjekt miteinander ermöglichen und diese bestimmte Art der systemübergreifenden Kopplung über das Spielobjekt verwalten Komponenten.
quelle