Ich erstelle eine component-based game object system. Einige Tipps:Spielobjekt-Komponenten in Spiel-Subsystemen registrieren? (Component-based Game Object Design)
GameObject
ist einfach eine Liste vonComponents
.- Es gibt
GameSubsystems
. Zum Beispiel, Rendering, Physik usw. JedeGameSubsystem
enthält Zeiger auf einige vonComponents
.GameSubsystem
ist eine sehr mächtige und flexible Abstraktion: Sie repräsentiert jeden Abschnitt (oder Aspekt) der Spielwelt.
Es besteht ein Bedarf an einem Mechanismus von Components
in GameSubsystems
Registrierung (wenn GameObject
erstellt und zusammengesetzt). Es gibt 4 nähert sich:
- 1: Chain of responsibility Muster. Jede
Component
wird jedemGameSubsystem
angeboten.GameSubsystem
trifft eine Entscheidung, welcheComponents
registriert (und wie man sie organisiert). Zum Beispiel kann GameSubsystemRender Renderable Components registrieren.
pro. Components
wissen nichts darüber, wie sie verwendet werden. Geringe Kopplung A. Wir können neue GameSubsystem
hinzufügen. Zum Beispiel fügen wir 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 GameSubsystems
reorganisieren. Zum Beispiel können GameSubsystemAudio, GameSubsystemRender, GameSubsystemParticleEmiterer in GameSubsystemSpatial eingebunden werden (um alle Audio, Emitter, Render Components
in der gleichen Hierarchie zu platzieren und Eltern-relative Transformationen zu verwenden).
con. Jeder für jeden Scheck. Sehr ineffizient.
con. Subsystems
über Components
wissen.
- 2: Jeder
Subsystem
sucht nachComponents
bestimmten Arten.
pro. Bessere Leistung als in Approach 1
.
con. Subsystems
noch über Components
wissen.
- 3:
Component
selbst Register inGameSubsystem(s)
. Wir wissen zur Kompilierungszeit, dass es einen GameSubsystemRenderer gibt, also wird ComponentImageRender so etwas wie GameSubsystemRenderer :: register (ComponentRenderBase *) aufrufen.
Observer Muster.Component
abonniert "update" -Ereignis (gesendet vonGameSubsystem(s)
).
pro. Performance.Keine unnötigen Kontrollen wie in Approach 1
und Approach 2
.
con. Components
sind schlecht mit GameSubsystems
gekoppelt.
- 4: Mediator Muster.
GameState
(dasGameSubsystems
enthält) kann RegisterComponent (Component *) implementieren.
pro. Components
und GameSubystems
wissen nichts voneinander.
con. In C++ würde es wie hässlicher und langsamer Typid-Schalter aussehen.
Fragen: Welcher Ansatz ist besser und vor allem in komponentenbasierten Design verwendet? Welche Praxis sagt? Irgendwelche Vorschläge zur (datengesteuerten) Implementierung von Approach 4
?
Vielen Dank.
Ich stimme Ihnen zu, dass diese Vorteile sehr wertvoll sind. Aber die erste hat eine andere Seite: keine "Komponenten" Wiederverwendbarkeit zwischen Projekten (mit verschiedenen Gruppen von "Subsystemen").Die Neuzusammensetzung von Teilsystemen in einem einzigen Projekt wird ebenfalls zu einem Problem. Es kann Hunderte von 'Komponenten' geben, deren Umschreiben alles eine langweilige Aufgabe ist. Ich glaube, dass dieser zweite Vorteil auch in anderen Ansätzen erreicht werden kann. –
Stimmen Sie mit Ihrem Punkt überein. Zu einer Zeit bin ich mit CBGOS Design nicht so viel vorgestellt, wie ich es wünsche. Aber die Arbeit, die ich damit zu tun hatte, brachte mich zu folgenden Überlegungen: * 1. * Design-Subsystem-Schnittstellen auf die abstrakteste Art und Weise, so dass die Menge der Subsysteme sich leicht über verschiedene Projekte hinweg ändern würde. * 2. * Bevorzugen Sie die Nachrichteninteraktion zwischen Komponenten vor allem und schneiden Sie Schnittstellenabhängigkeiten aus, wo es möglich ist. – Keynslug
Es kann funktionieren. Ich habe Leute in den Foren von gamedev.net getroffen, die diesen Ansatz auch verwenden. –