Ich erstelle ein komponentenbasiertes Spielobjektsystem . Einige Hinweise:
GameObjectist einfach eine Liste vonComponents.- Es gibt
GameSubsystems. Zum Beispiel Rendering, Physik usw. JedesGameSubsystementhält Zeiger auf einige vonComponents.GameSubsystemist 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 Componentsin GameSubsystems(wenn GameObjecterstellt und zusammengesetzt). Es gibt 4 Ansätze :
- 1: Muster der Verantwortungskette . Jeder
Componentwird jedem angebotenGameSubsystem.GameSubsystemtrifft eine Entscheidung, welcheComponentsregistriert werden soll (und wie sie organisiert werden sollen). Beispielsweise kann GameSubsystemRender renderbare Komponenten registrieren.
Profi. Componentsweiß 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 Componentsin derselben Hierarchie zu platzieren und übergeordnete relative Transformationen zu verwenden).
con. Jeder Scheck. Sehr ineffizient.
con. Subsystemswissen über Components.
- 2: Jeder
Subsystemsucht nachComponentsbestimmten Typen.
Profi. Bessere Leistung als inApproach 1 .
con. Subsystemsnoch wissen über Components.
- 3:
Componentregistriert 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. Componentssind schlecht gekoppelt mit GameSubsystems.
- 4: Mediatormuster .
GameState(das enthältGameSubsystems) kann registerComponent (Component *) implementieren.
Profi. ComponentsundGameSubystems 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.
Componentsin GameObjectsist 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, GameSubsystemist völlig falsch.