________________________________________________________
Je vais ici parler dans un contexte Game Dev, mais fondamentalement, câest un sujet qui est transverse au mĂ©taverse (ouai jâose le mot đ) du dĂ©veloppement : lâorientĂ© Object VS lâorientĂ© Data.
________________________________________________________
Aux origines de la galĂšre : le OOP !
Le OOP (Object Oriented Programming) dispose de cette incroyable force quâil Ă©pouse Ă merveille les prĂ©dispositions de nos cerveaux mollassons :
- on découpe nos concepts métier en objets
- ils portent à la fois des propriétés et des méthodes/fonctions
- chaque objet a droit Ă son instance distincte et il pourra donc ĂȘtre autonome dans son coin
- et on pourra ensuite lentement tomber dans lâenfer des hĂ©ritages et des dĂ©pendances en cascade⊠mais câest un autre sujet. đ
Dans le cadre du jeu vidĂ©o, cette approche est trÚÚÚÚÚÚs attrayante. Parce que non seulement ça colle dâun point de vue dĂ©coupage fonctionnel (un objet par joueur / ennemi / dĂ©cors / UIâŠ), mais ça colle aussi vachement bien dâun point de vue gameplay :
je veux crĂ©er plusieurs ennemis distincts qui attaquent mon joueur ? Hop, une instance dâobjet par ennemi, chacun avec ses propres points de vie, son propre attack pattern, sa propre reconnaissance du terrain⊠et potentiellement, rĂ©sultante de tout ça : un comportement unique par ennemi !
Tous les gros moteurs de jeux ont donc adopté cette approche dans leur design de base et dans le choix du langage adossé :
- Unreal Engine avec le C++
- Unity avec le C#
- Godot avec le C# et son langage dĂ©diĂ© le GDScript (qui est une variante intĂ©ressante, plus modulaire autour dâun concept de composition/noeud).
Mais tout aussi flexible et adaptĂ© quâest le POO pour le game design, il a un problĂšme majeur : il scale trĂšs mal. A vouloir regrouper au sein dâun mĂȘme objet Ă la fois les donnĂ©es et ses traitements, par design les objets deviennent des Ă©lĂ©ments extrĂȘmement volatiles dont on ne sait Ă lâavance, ni ce quâils vont faire, ni la taille mĂ©moire quâils vont occuper.
Cette nature indĂ©finie de lâobjet oblige une architecture qui permet de manager nâimporte quel Ă©lĂ©ment qui lui serait attachĂ©. Ne pouvant anticiper la structure de lâobjet, sa crĂ©ation se fait Ă la volĂ©e avec un rangement mĂ©moire parcĂ©laire (ou en moins poĂ©tique : yolo, je te range oĂč je trouve de la place libre).
Travailler sur un objet nĂ©cessite alors de le reconstituer façon fil dâAriane, en remontant Ă chaque section de mĂ©moire oĂč une partie de ses donnĂ©es est stockĂ©e.
Or les accĂšs mĂ©moires, câest le coeur de la performance et ce scan incessant pour reconstituer les objets est un couperet brutal.
________________________________________________________
Le saint sauveur : le DOD !
LâECS (Entity Component System) est une architecture qui rentre dans le paradigme du DOD (Data Oriented Design). Dans le cadre de Unity, câest mĂȘme trĂšs clair, on parle de DOTS (Data Oriented Technology Stack). Promis je mâarrĂȘte lĂ avec les acronymes des enfers infernaux. đ
LâECS en soi nâest pas un concept nouveau. Si jâen crois WikipĂ©dia, la 1Ăšre version dâune architecture similaire Ă lâECS dans un jeu commercial remonte Ă Thief : The Dark Project en 1998.
-Digression- Jeu extraordinaire au passage, auquel jâai eu la chance de pouvoir jouer dans mon enfance (attention vos rĂ©tines : trailers dâĂ©poque).
Il disposait dâune quantitĂ© impressionnante dâobjets interagissables et dotĂ©s de physique, quâon pouvait lancer pour faire du bruit, faire bouger dâautres objets, assommer des gardes etc etc⊠en vue de commettre le vol parfait sans aucun mort. Une rĂ©fĂ©rence en terme dâinfiltration. -Fin de digression-
Lâessence de lâECS : ne plus organiser le code autour dâune logique fonctionnelle, mais dâune logique qui vise Ă optimiser lâagencement de la donnĂ©e, aussi sommairement nommĂ© le principe de localitĂ©.
Son design en soi est relativement simple :
- on remplace le concept dâobjet par celui dâentity, qui nâest quâun identifiant unique.
- à cette entité, on va lier des components, qui ne sont que des conteneurs de données (des structs)
- on regroupe les entitĂ©s qui disposent des mĂȘmes composants dans des archetypes : toutes les entitĂ©s appartenant Ă un mĂȘme archĂ©type sont rangĂ©es de maniĂšre contiguĂ« en mĂ©moire
- on peut alors query des groupes dâentitĂ©s en filtrant par composant (comme on requĂȘterait une base de donnĂ©es)
- au travers de systems centralisĂ©s, on traitera la donnĂ©e requĂȘtĂ©e en masse via un dĂ©coupage en chunks et une rĂ©partition sur du multi-threading
ImplĂ©mentation OOP vs ECSEn OOP, on aurait ici eu un personnage qui porterait une position, une direction et une vitesse ainsi qu'une mĂ©thode Move() qui s'exĂ©cuterait Ă chaque frame.En ECS, on crĂ©e 3 composants de donnĂ©es, liĂ©s entre eux par lâID unique dâune entitĂ©. Ensuite un systĂšme isolĂ© va requĂȘter toutes les entitĂ©s qui disposent de la combinaison de ces 3 composants (quâils appartiennent ou non au mĂȘme archĂ©type, seule la combinaison de composants importe) et va traiter le calcul du mouvement en parallĂšle.
Cette approche permet dâaugmenter dâau moins un facteur (x10) les performances. Des exemples seront plus parlant :
VAT (Vertex Animated Texture)C'est une technique d'animation qui stocke les mouvements des modÚles dans une texture lue directement par le GPU. AllÚge fortement la charge CPU, au détriment d'un coût en RAM et d'une perte de flexibilité dans le process d'implémentation des animations. Lien vers un article (anglais) si vous voulez plus de détails.
- Les 3 vidĂ©os tournent autour de 40-60 FPS. Lâapproche OOP me permet dâanimer 1 000 unitĂ©s (disclaimer : en y ajoutant le VAT, entre 5k et 10k serait une cible envisageable). Avec lâapproche ECS, je peux monter Ă 100 000 unitĂ©s, avec par dessus une simulation qui leur permet de sâesquiver et dâavoir un vrai pathfinding via un champs de vecteurs. LâĂ©cart de performance entre les 2 implĂ©mentations est abyssal pour ce genre de cas dâusage. -
Câest donc une architecture extrĂȘmement puissante, qui a trouvĂ© moult cas dâusage dans des simulations de :
- foules
- trafic
- villes / écosystÚmes
- projectiles / particules
- sandbox / MMO
qui manipulent tous de grandes quantitĂ©s dâobjets non-statiques et pour lesquels le DOD fait des merveilles.
Mais vous remarquerez que cette liste est plutĂŽt restreinte et quâon nâutilise pas cette architecture partout⊠đ
________________________________________________________
Un grand pouvoir impliqueâŠ
Il est un piĂšge dans lequel il ne faut pas tomber : la performance pour la performance, ce bon vieux over-engineering ! (et bon sang que câest dur de ne pas tomber dans ce piĂšge quand on fait de lâingĂ©nierieâŠ).
Sâil est vrai que â La flexibilitĂ© est un compromis de performance â, lâinverse est tout aussi vrai â La performance est un compromis de flexibilitĂ© â. Or la flexibilitĂ© est lâun des coeurs de la productivitĂ©.
La performance nâest que rarement un objectif en soi (Ă part si vous vous appelez Google/Amazon et que vous devez rĂ©pondre Ă des milliards de requĂȘtes utilisateurs Ă la seconde). Non elle est surtout un prĂ©-requis minimal dâacceptation de lâutilisateur :
- si la performance est trop dĂ©gradĂ©e, lâexpĂ©rience utilisateur le sera aussi et il partira
- mais ĂȘtre trop performant nâamĂ©liorera pas lâexpĂ©rience perçue cĂŽtĂ© utilisateur et vous aurez dĂ©pensĂ© temps/argent en pure perte
La performance est donc une affaire dâĂ©quilibre : une limite basse stricte Ă ne jamais franchir et une limite haute diffuse Ă tempĂ©rer, afin de maximiser la productivitĂ© de features, qui est le but premier.
LâECS Ă©tant une rĂ©ponse de performance, il est par nature plus complexe et peu flexible au changement. Il est beaucoup plus long Ă mettre en place, demande de nombreux composants distincts, impose des restrictions sur le type de donnĂ©es et globalement, rallonge drastiquement les temps de dĂ©veloppement, mĂȘme pour des features simples.
Lâindustrie a choisi comme toujours lâapproche la plus pragmatique : lâhybride. Savoir choisir ce qui mĂ©rite une approche ECS pour la performance VS choisir lâapproche OOP quand le fonctionnel et lâitĂ©ration priment. Lâapproche ECS est par exemple inutile dans la plupart des jeux avec des scĂšnes restreintes, qui compose lâimmense majoritĂ© de nos catalogues. Au contraire, la moindre simulation de masse gagnera massivement Ă lâimplementer.
Mais si lâindustrie a longtemps dĂ» traiter lâECS et lâOOP comme deux mondes sĂ©parĂ©s, une nouvelle voie sâouvre peut-ĂȘtre. A la GDC de mars 2026, Unity a dĂ©cidĂ© de taper fort : pourquoi ne pas fusionner les 2 approches ?
LâECS deviendrait un package core du moteur (et non plus un add-on Ă installer), Ă la maniĂšre dâun Bevy (un moteur de jeu en Rust nativement ECS). Les entitĂ©s deviendront alors le backend de tout le moteur, mais pour autant les GameObjects ne disparaissent pas : ils deviennent une couche de confort par dessus les entitĂ©s, le moteur prenant la main pour faire la conversion. La force du design OOP par dessus, la puissance de lâECS en dessous. â LâECS ne sera plus un choix, mais le socle. Le GameObject ne sera plus une alternative, mais une interface. â
En dâautres termes, lâapproche hybride dont je parlais plus haut ne sera plus un compromis dâarchitecture, mais le mode de fonctionnement par dĂ©faut du moteur. Vous voulez du prototypage rapide ? Vous restez au niveau GameObject. Vous voulez de la performance brute ? Le moteur vous permettra de basculer votre architecture en GameObjects vers de lâECS et ainsi profiter de ses options. MĂȘme donnĂ©es, mĂȘme moteur, mais deux mondes en un.
Et je vous avoue que je suis trĂšs curieux de voir le rĂ©sultat. đ



