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.
Components
in GameObjects
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.