Problème avec les systèmes.

...entre autres.

Le problème exposé dans ce sujet a été résolu.

Bonjour,

J'essaye actuellement d'implémenter un petit Entity Component System en C++, cependant je me heurte à de nombreux problèmes et questions. Je poste donc ça ici en vrac, en espérant qu'une âme charitable veuille bien m'aider :)

Donc, je pense avoir compris le fonctionnement des ECS : Les component représentent les données, et sont "taggés" par un identifiant, celui de l'entity auxquels ils appartiennent. Les Systems quant à eux représentent les algorithmes qui sont appliqués sur ses Components.

Cependant, les questions suivantes se posent :

Où précisément sont stockés les Component?

Comment les Systems accèdent-t-ils aux Components?

Comment les Systems savent qu'une Entity doit être modifiée?

Lors de la suppression d'une Entity, comment sont supprimés toutes les données relatives à celle-ci?(Component, System, etc…)

Lors de la création d'une Entity, comment est elle ajoutée aux Systems nécessaires?

Comment les Systems peuvent-ils communiquer entre eux?

Comment faire pour que plusieurs systèmes puissent accéder aux mêmes Components?

Voilà, il y en a beaucoup, et elles sont un peu en vrac, mais bon, j'espère que quelqu'un pourra me répondre.

Merci d'avance,

Arthur.

Hello Ce qui est rarement cité dans les articles sur les ECS, et ce qui est pourtant une des clés de voute d'un mecs fonctionnel, c'est un concept clé : le "world". C'est un choix de design fait par de nombreux ECS notamment. Et ça va répondre à quelques unes de tes questions.

Où précisément sont stockés les Component?

Arthur.

Dans pas mal d'ECS, c'est dans le world, dans une structure de données adaptée et performante

Comment les Systems accèdent-t-ils aux Components?

Arthur.

Au travers du world ;) c'est un peu le lien entre les différentes parties de l'ECS Attention cependant à ne pas en faire une classe Fourre tout dans la conception (respect du SRP oblige) ! ;)

Comment les Systems savent qu'une Entity doit être modifiée?

Arthur.

Chaque system boucle sur toutes les entités et en fonction de leurs composants, elle applique ou non des modifs

Lors de la suppression d'une Entity, comment sont supprimés toutes les données relatives à celle-ci?(Component, System, etc…)

Arthur.

Là c'est un choix de conception, en général le world supprime l'entité et en profite pour notifier les systems concernés, puis nettoie les composants. Cependant dans la plupart des ECS, pour tirer profit au maximum de la contiguïté de la mémoire, on ne supprimera quasiment jamais une entité, on se contentera de la désactiver jusqu'à ce qu'elle soit réaffectée.

Lors de la création d'une Entity, comment est elle ajoutée aux Systems nécessaires?

Arthur.

Là ça dépend totalement des choix de conception : soit l'utilisateur de l'ECS doit le faire manuellement en appelant une méthode du system pour ajouter une entité, soit lors de l'ajout de l'entité au world, un contrôle automatique ajoute l'entité aux bons systems

Comment les Systems peuvent-ils communiquer entre eux?

Arthur.

Je te laisse te renseigner sur les divers procédés de messaging, notamment le pattern observer qui peut être un bon début

Comment faire pour que plusieurs systèmes puissent accéder aux mêmes Components?

Arthur.

Comme ils ne possèdent pas les entités mais uniquement des références dessus, il n'y a aucun souci, plusieurs systems peuvent accéder à la même entité et aux même composants

En espérant avoir clarifié ces quelques points ! N'hésite pas à demander si je n'ai pas été assez clair. Bonne soirée

LeB0ucEtMistere

+2 -0

D'accord, merci bien, c'était la classe World qui me manquait. Cependant, j'ai une dernière question :

Chaque system boucle sur toutes les entités et en fonction de leurs composants, elle applique ou non des modifs

D'accord, mais si l'entité est un simple tag que l'on met sur un component, y a t-il un endroit ou tout les component d'une entité sont référencés, ou quelque chose comme ça?

j'ai pas été très clair dans ma réponse. Je le refais : en gros chaque system va opérer sur telle combinaison de components, admettons un system qui gère les déplacements, et qui est prévu pour travailler sur tout ce qui possède un composant position, et un composant vitesse. Quand tu créés une entité dans ton world, possédant ces composants, tu voudrais typiquement que celle ci soit directement liée au system. Le system va donc stocker, suivant la façon dont tu souhaites l'implémenter, une ref vers l'entité, ou une réf vers les composants de l'entité. Quand le système travaille, il boucle simplement sur ce tableau de refs. C'est par l'intermédiaire d'une table de correspondance que le system peut lier l'entité et ses composants. Là encore, on voit bien qu'un des problèmes majeurs reste le choix de la structure de données adaptée à ce stockage et à cette correspondance, car le traitement doit être rapide, et les composants doivent donc le plus possible être dans des cases contiguës dans la mémoire. Je pense personnellement que c'est une mauvaise idée de laisser le system connaitre seulement les composants et pas l'entité qui les lie, car les composants ne savent pas qui les utilise tandis que l'entité "connait" ses composants au travers d'une table associative stockée dans le world par exemple.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte