Journal d’Impetus Spheroid 4 — ECS

Vous vous êtes peut-être demandé, en regardant la dernière vidéo de présentation d’Impetus Spheroid, comment diable ai-je réussi à implémenter[1] tous les événements modifiant les composantes fondamentales de mon jeu, comme la gravité ou l’écoulement du temps. La réponse se trouve dans ce que l’on appelle en programmation un design pattern, un modèle de construction utilisé pour résoudre un problème spécifique : ECS.

Le principe de base de l’ECS, ou Entity-Component-System, est que chaque élément du jeu (Entity) est construit à partir de plusieurs composants (Component) que d’autres modules du programme (System), comme le moteur physique, le moteur graphique ou la logique du jeu vont mettre à profit. Certes, cela paraît être une idée simplissime et évidente, mais elle est cependant particulièrement riche en possibilités, si l’on suit le principe jusqu’au bout en se détachant des paradigmes de programmation plus traditionnels. Car l’esprit est d’accorder une immense flexibilité et modularité à chaque élément du jeu, les composants pouvant s’ajouter, se retirer ou encore se mettre en pause à volonté.

Par exemple, dans le cas d’Impetus Spheroid, chaque balle à l’écran possède plusieurs composants tel que la position, la vitesse, la gravité ou encore la solidité. Ils sont ensuite interprétés par un Système qu’est le moteur physique du jeu qui s’occupe de faire tomber les objets sensibles à la gravité ou de faire rebondir entre eux les objets solides. Et c’est là que ça devient intéressant : je souhaite que les balles se figent en l’air ? Je mets en pause le composant vitesse. La gravité inversée surprendra le joueur ? Une petite modification de la composante gravité de chaque balle en ce sens et le tour est joué. Des balles spéciales traversant les obstacles et insensibles à la gravité feraient un superbe power-up ? Il me suffit de créer des balles sans composant gravité ni solidité. Facile !

Illustration ECS

Ainsi, ce pattern possède de grands avantages du point de vue flexibilité… mais de tout aussi grands défauts, du côté de l’optimisation cette fois-ci. En effet, chaque système devra par exemple chercher à chaque frame[2] l’ensemble des entités possédant tel ou tel composant… si le nombre d’éléments dans le jeu est très grand, cette recherche risque d’avoir un certain coût multiplié par le nombre de systèmes différent, ce qui peut rapidement aboutir à des délais relativement monstrueux, la recherche d’informations dans la mémoire vive étant bien plus lente que tous les calculs effectués par le processeur.

Autre problème : si on implémente naïvement un ECS, les composants risquent d’être complètement éparpillés dans la mémoire… ce qui est très mauvais pour les performances. La raison repose sur l’architecture moderne de nos ordinateurs : lors d’une recherche d’informations dans la mémoire vive, le processeur charge dans une mémoire cache un bloc de donnée contiguë, ce qui lui permet de beaucoup plus rapidement avoir accès à celles-ci, tant qu’elle se trouve dans ce bloc. Dans notre cas, le CPU doit charger à chaque fois un nouveau bloc mémoire contenant le composant voulu sans pouvoir profiter de la vitesse accrue lors de la lecture dans ce bloc.

Cependant, ces inconvénients ne se remarquent que pour une œuvre possédant un très grand nombre d’entités, ce qui n’est pas le cas de mon jeu, le nombre de balles, de cibles et d’obstacles à l’écran étant fortement limité.

Voilà voilà, c’est tout pour aujourd’hui, je voulais vous donner un petit aperçu des coulisses de mon jeu. Attendez-vous à un prototype jouable d’ici mars !


Petites notes :

[1] L’implémentation est la concrétisation en code d’un concept logique

[2] Une frame est une image affichée par l’écran, il faut environ 30 frames par secondes (fps) pour qu’un jeu soit fluide


Ressources supplémentaires :

Présentation en français des ECS

Un aperçu du temps pris par différente opérations pour un ordinateur

Comment optimiser un système ECS pour le cache du CPU

Wiki ECS

Comment implémenter efficacement un ECS

Publicités

Une réflexion sur “Journal d’Impetus Spheroid 4 — ECS

^,..,^

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s