Je crée un système d'objets de jeu basé sur des composants . Quelques conseils:
GameObject
est simplement une liste deComponents
.- Il y en a
GameSubsystems
. Par exemple, le rendu, la physique, etc. ChacunGameSubsystem
contient des pointeurs vers certainsComponents
.GameSubsystem
est une abstraction très puissante et flexible: elle représente n'importe quelle tranche (ou aspect) du monde du jeu.
Il est nécessaire dans un mécanisme d'enregistrement Components
en GameSubsystems
(quand GameObject
est créé et composé). Il existe 4 approches :
- 1: Modèle de chaîne de responsabilité . Tout
Component
est offert à tousGameSubsystem
.GameSubsystem
prend la décisionComponents
de s'inscrire (et comment les organiser). Par exemple, GameSubsystemRender peut enregistrer des composants pouvant être rendus.
pro. Components
ne savent pas comment ils sont utilisés. Couplage bas. A. Nous pouvons en ajouter de nouveaux GameSubsystem
. Par exemple, ajoutons GameSubsystemTitles qui enregistre tous les ComponentTitle et garantit que chaque titre est unique et fournit une interface pour interroger des objets par titre. Bien sûr, ComponentTitle ne doit pas être réécrit ou hérité dans ce cas. B. Nous pouvons réorganiser l'existant GameSubsystems
. Par exemple, GameSubsystemAudio, GameSubsystemRender, GameSubsystemParticleEmmiter peuvent être fusionnés dans GameSubsystemSpatial (pour placer tous les fichiers audio, emmiter, restituer Components
dans la même hiérarchie et utiliser des transformations relatives aux parents).
con. Chèque de chaque à chaque. Très inefficace.
con. Subsystems
savoir Components
.
- 2: Chacun
Subsystem
rechercheComponents
des types spécifiques.
pro. De meilleures performances qu'en Approach 1
.
con. Subsystems
savoir encore Components
.
- 3:
Component
s'enregistre dansGameSubsystem(s)
. Nous savons au moment de la compilation qu'il existe un GameSubsystemRenderer, nous allons donc appeler ComponentImageRender quelque chose comme GameSubsystemRenderer :: register (ComponentRenderBase *).
pro. Performance. Pas de contrôles inutiles comme dans Approach 1
.
con. Components
sont mal couplés avec GameSubsystems
.
- 4: Motif médiateur .
GameState
(qui contientGameSubsystems
) peut implémenter registerComponent (Component *).
pro. Components
et GameSubystems
ne savent rien les uns des autres.
con. En C ++, cela ressemblerait à un commutateur de typeid laid et lent.
Questions:
Quelle approche est la meilleure et la plus utilisée dans la conception basée sur les composants? Quelle pratique dit? Des suggestions sur la mise en œuvre de Approach 4
?
Je vous remercie.
la source
Components
enGameObjects
est hors de portée de ma question. Lisez des articles sur l'approche basée sur les composants ou posez votre propre question sur ce site si cela vous intéresse. Ce à quoi vous pensezGameSubsystem
est totalement faux.Réponses:
Porte numéro 3 ... Le composant s'enregistre dans GameSubsystem (s)
Le composant est en place pour garder le couplage abstrait du GameObject lui-même. Quelque part, quelque part quelque chose a en fait besoin d'interagir avec les sous-systèmes et c'est le composant et son objectif.
Le couplage n'est pas vraiment une mauvaise chose dans ce cas.
Les performances sont essentiellement requises dans ce cas si vous vous attendez à avoir une complexité dans votre système, vous ne pouvez tout simplement pas vous permettre les approches de style de recherche des autres options.
Enfin, si un sous-système doit être réactif à un autre (rendu, physique, audio, tous doivent faire des choses quand quelque chose se passe), les composants peuvent faciliter cela les uns avec les autres à travers l'objet de jeu et garder ce type particulier de couplage de systèmes croisés gérable à travers le Composants.
la source