Qu'est ce qu'ECS et Amethyst

Et pourquoi ça a l'air cool

Cela fait un bon moment que je m'intéresse au Rust pour différentes raisons:

  • C'est un langage bas-niveau, et après plus de 10 ans de Java, ça fait du bien de voir autre chose
  • C'est pensé pour la concurrence et la performance
  • Le concept d'ownership me sauce bien, comme disent les jeunes
  • Cargo est bien foutu
  • La communauté autour du Rust n'a pas l'air rempli de trou du cul
  • Apprendre des trucs, c'est cool

Bon, par contre, les compilations sont uuuuultra longues

Là dessus, je me suis toujours intéresser au jeux vidéo, principalement en tant que joueur, mais aussi, pourquoi pas, en tant que créateur.

Au détour de mes balades sur internet, je suis tombé sur cette vidéo

Cela m'a donné envie de jeter un coup d’œil au framework Amethyst et à ce fameux ECS


ECS est un acronyme pour Entity, Components, System avec:

  • Entity: Une entité, qui peut être n'importe quoi: un arbre, un flingue, un ennemi, une fleur dans le décors, un personnage, un élément du l'interface, n'importe quoi. L'entité est juste un identifiant d'un élément du jeu
  • Component: Un "sac" de données (Un pojo/record en Java, une struct en Rust, C, C++). Par exemple une position géographique, un nombre de vie, un score.
  • System: Des daemons qui se déclenchent à chaque frame et qui vont s'occuper des entités (sans nécessairement les connaitre) qui ont les components désirés. Par exemple un système qui va prendre toutes entités qui ont les components position et vélocité et qui va appliquer cette vélocité à la position pour faire bouger l'entité

En plus de ça, il y a les ressources qui sont, en gros, des components globaux au jeu, i.e. non attaché à une entité.

Chaque système va typiquement tourner sur un thread, rentabilisant ainsi votre Ryzen 9 3900X.

Et là, vous me dites "T'es bien mignon avec tes systèmes et ton multi threading de ouf mais c'est pas galère de gérer les race conditions et les dead locks?". Ce à quoi je répondrai simplement Rust

Rust est pensé pour ne pas avoir à ce prendre la tête avec ses questions. Le compilateur est assez malin pour nous arrêter avant de faire une connerie. En plus, le dispatcher du framework Amethyst permet d'ordonner l'ordre d’exécution des systèmes de façon intelligente, en fonction de la façon dont on se sert des components: en lecture (pour récupérer la vélocité si je reprends l'exemple précédent) ou en lecture/écriture (pour appliquer la dite vélocité sur la position)

En plus de ça, Amethyst propose un Event Channel qui permet aux systèmes de communiquer entre eux via des événements


Bref, tout ça pour dire que ces dernières lectures/découvertes m'ont motivé à me sortir les doigts et à tenter de programmer un petit jeu, je sais pas encore sous quel forme.

Première étape: afficher et animer un sprite 2D!