Cette page vous donne les différences entre la révision choisie et la version actuelle de la page.
ecs [2016/03/26 14:54] gbdivers [Problématiques générales] |
ecs [2025/02/01 04:33] (Version actuelle) gbdivers |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | https://github.com/SanderMertens/ecs-faq | ||
+ | |||
====== L'Entity Component System - Qu'est ce que c'est et comment bien s'en servir ? ====== | ====== L'Entity Component System - Qu'est ce que c'est et comment bien s'en servir ? ====== | ||
Ligne 426: | Ligne 428: | ||
Nous allons voir dans un premier temps a quoi correspond cette approche et ce qui la distingue de la programmation objet. Nous verrons ensuite comment implémenter concrètement un ECS en C++. | Nous allons voir dans un premier temps a quoi correspond cette approche et ce qui la distingue de la programmation objet. Nous verrons ensuite comment implémenter concrètement un ECS en C++. | ||
+ | |||
+ | ==== Data-driven programming ==== | ||
+ | |||
+ | Importance du DDP? Exemple pour illustrer avec comparaison avec la complexité algo | ||
+ | |||
+ | Vous avez peut etre vu la notation O(n) pour la complexité algo. | ||
+ | |||
+ | 1. O(n) avec constante, depend de matos. Certains algo vont utiliser des fonctionnalités du CPU et donc etre plus performant, meme en ayant une O(n) plus mauvaise. En particulier vectorisation, mem cache, GPU, etc. qui fait que certains algos ont un moins bon O(n) mais sont plus performant en pratique (meilleur utilisation des caches, meilleur utilisation des threads, etc) | ||
+ | |||
+ | 2. O(n) mesure un comportement asymptomatique, donc n->infini. Mais en pratique, ce n'est jamais infini, et dans dans un domaine particulier de n, un algo peut etre plus performant. Par exemple, algo plus performant sur petite taille de n. Un exemple concret, certains algo de tri utilisent un methode pour faire un premier tri en bloc de taille N, puis utilisent un autre algo pour trier chaque block (de petite taille). | ||
+ | |||
+ | 3. O(n) est une mesure de la complexité. Autre : big-theta, big-omega, etc. https://en.wikipedia.org/wiki/Big_O_notation. Pour rappel, avec une liste spécifique de valeurs de taille n, il y aura un temps mesuré t. Chaque liste de valeurs va donner des temps différents. Pour chaque algo, il y a une donc un t_min et un t_max pour chaque valeur de n et l'ensemble des mesures de perfs d'un algo est un enveloppe. Les notations O, theto, omega, etc. mesure un parametre particulier de cette envoloppe : par exemple le plus mauvais cas, le cas moyen, etc. | ||
+ | |||
+ | Du coup, pour des données reels dans un cas d'utilisation particulier, il est possible de ne pas être dans l'enveloppe complete, mais dans un sous groupe, et dans ce cas, la mesure de complexité peut etre mauvais. Par exemple, certains algos de tris sont plus efficace quand la majorité des valeurs sont deja trié et qu'il y a peu de valeur a déplacer (ce qui arrive par exemple quand vous ajoutez de nouvelles données dans un tableau deja trié). | ||
+ | |||
+ | Pour resumer, il y a donc des caractéristiques sur les donne2es dans un contexte et cas d'utilisation particulier, qui peu influencer le choix de l'algo, le choix des structures de données, etc. Le principe de data driven dev est d'optimiser le choix des algos par rapport aux donne2es. | ||
+ | |||
+ | Note : c'est important ausi dans les tests. On test souvent en utilisant des valeurs particuliere ou des valeurs aleatoire, mais cela peut etre important aussi de faire des tests avec des données reelles. | ||
+ | |||
==== Différentes approches pour concevoir les choses ==== | ==== Différentes approches pour concevoir les choses ==== | ||
Ligne 827: | Ligne 848: | ||
</code> | </code> | ||
- | === A trier === | + | === À trier === |
- | * Eviter de parcourir tous les composants. Comment parcourir une sous-liste de composant ? D'entité | + | * Éviter de parcourir tous les composants. Comment parcourir une sous-liste de composants ? D'entité ; |
- | * Exemple : collision. Quadtree, octree, bounding box, etc. (spatial partitioning) | + | * Exemple : collision. Quadtree, octree, bounding box, etc. (spatial partitioning) ; |
- | * sauvegarder l'état du jeu ? (liste des entités, des composants) Passer les informations via réseau ? (sérialisation) | + | * sauvegarder l'état du jeu ? (liste des entités, des composants) Passer les informations via réseau ? (sérialisation) ; |
* hiérarchie d'entités : relation entre plusieurs entités liées | * hiérarchie d'entités : relation entre plusieurs entités liées | ||
- | Exemple: 3 perso A (marche à côté du char), B (dans le char), C (dans la tourelle), 1 char avec tourelle. | + | Exemple: 3 persos A (marchent à côté du char), B (dans le char), C (dans la tourelle), 1 char avec tourelle. |
^ Entité ^ Composant position relative ^ Composant "Transporte quelque chose" ^ | ^ Entité ^ Composant position relative ^ Composant "Transporte quelque chose" ^ | ||
Ligne 843: | Ligne 864: | ||
| tourelle | x_tour, y_tour | char | | | tourelle | x_tour, y_tour | char | | ||
- | Au final, la position absolue (X, Y) des objets dans le monde sont calculés en fonctions des positions relatives et des dépendances : | + | Au final, la position absolue (X, Y) des objets dans le monde est calculée en fonction des positions relatives et des dépendances : |
* X_char = x_char | * X_char = x_char | ||
Ligne 1098: | Ligne 1119: | ||
* https://www.youtube.com/watch?v=WpkDN78P884 | * https://www.youtube.com/watch?v=WpkDN78P884 | ||
* http://www.drdobbs.com/cpp/building-your-own-plugin-framework-part/204202899 | * http://www.drdobbs.com/cpp/building-your-own-plugin-framework-part/204202899 | ||
+ | * http://gamedev.stackexchange.com/questions/58693/grouping-entities-of-the-same-component-set-into-linear-memory | ||
+ | * http://gamedev.stackexchange.com/questions/31473/what-is-the-role-of-systems-in-a-component-based-entity-architecture/31491#31491 | ||
+ | * https://tsprojectsblog.wordpress.com/ | ||
+ | |||
+ | {{:ecs_cache.png?200|}} | ||
+ | |||
+ | https://github.com/skypjack/entt | ||
===== Conclusion ===== | ===== Conclusion ===== |