#Décembre 2/2 - Les moteurs de jeux
Je vous souhaite à tous un très joyeux Noël. Vous êtes plus nombreux chaque jour. Merci pour vos petits mots, vos encouragements et vos questions.
Un jeu vidéo très attendu est sorti il y a quelques semaines : Cyberpunk 2077. Comme souvent dans ces énormes productions, sa sortie est entâchée de nombreux bugs. Ce sont le genre de bugs qui me font réfléchir à la construction même d'un jeu vidéo. Cela reste de la programmation, des lignes de codes. Ça va forcément planter à un moment. Pourquoi ce genre de phénomène devrait-il être exclusif au seul développement web ?
Discutons de quelques ponts avec le développement web.
Les moteurs de jeux
Qu'est-ce qu'un moteur de jeu ?
Un moteur de jeu est un groupement de composants :
Graphismes
Physique
Sons
Interface utilisateurs (clavier, souris, manette, webcam...)
Intelligence artificielle
Editeur de niveau
...
Il faut noter qu'un moteur de jeu n'est pas obligatoire pour créer un jeu vidéo. Il est possible de tout réécrire ou bien d'utiliser des frameworks. Ces derniers viennent avec une documentation et sont plus permissifs, plus personnalisables alors qu'un moteur de jeu complet vient avec toute une suite logicielle afin d'accélérer les développements. Pas besoin de réinventer la roue à chaque fois.
Que ce soit framework ou moteurs de jeux, ils se reposent généralement sur une ou des librairies graphiques comme DirectX, OpenGL, WebGL ou encore Vulkan.
Si je devais faire un pont avec le web je dirais :
Moteurs de jeux => ~Suite IntelliJ + ~Suite Adobe
Framework => Symfony/Angular, tout dépend de ce que gère le framework
Librairie => MomentJS, Material Design, Redux...
Graphismes
On s'aperçoit qu'un moteur de jeu, ce n'est pas que du graphisme. Mais comme pour le développement web, même si ça brille sous le capot, si le design est moche les utilisateurs seront mécontents. Dans le cas de Cyberpunk, le jeu est très joli. Cependant pour profiter pleinement de ce lustrage, il faut un PC avec une carte graphique à 600€.
Le jeu a été commercialisé sur les Playstation et les Xbox initialement sorties en 2013. Pensez-vous que le résultat est le même sur ces consoles que sur notre fameux PC surpuissant ? Les développeurs le savaient-ils ? Là n'est pas la question. Nous développons sur du matériel généralement haut de gamme et nous avons tendance à oublier que tout le monde n'est pas équipé comme nous. Quelques points de vigilance concernant nos utilisateurs :
Leur téléphone peut avoir plus de 2 ans
Leur écran d'ordinateur n'est pas forcément Full HD
Leur navigateur n'est pas obligatoirement Google Chrome
Ils n'ont pas tous la fibre optique
Modularité
Un autre point que je trouve intéressant sur la partie graphique concerne la gestion de plusieurs librairies. J'ai constaté sur plusieurs jeux qu'il était possible de choisir la librairie graphique. Cela m'a rappelé à quel point nous mettons l'accent sur la séparation des couches dans nos développements.
Généralement, nous séparons nos applications comme suit :
Vue - Affichage : React, Javascript pure, Application mobile
Contrôleur - Métier : API Rest ou GraphQL, Managers
Modèle - Données : Entités, Doctrine, Repositories
Stockage : MySQL, MongoDB
Si nos couches sont bien séparées, il est possible d'en changer une sans impacter les autres. Je trouve que le choix de la sélection de la librairie graphique à utiliser dans un jeu est un très bon exemple.
Cette modularité permet également de séparer les équipes développement. Pendant que l'une travaille sur l'interface utilisateur, une autre peut gérer l'intelligence artificielle des ennemis par exemple. Cela vous paraît couler de source ? Alors pourquoi vos commits de design contiennent-ils des modifications sur des managers ?
Avoir accès à l'intégralité du code ne doit pas nous autoriser à tout modifier. Quelles en seraient les conséquences ? Imaginez la situation suivante : vous détectez un bug en production. Il a été introduit par la modification d'une fonctionnalité que vous aimeriez revert. Cependant, ce commit embarque beaucoup trop de modifications sur trop de fonctionnalités différentes. Vous ne pouvez pas revert, vous devez obligatoirement déployer un hotfix.
Souvenez vous :
Une branche = Une fonctionnalité
Commits atomiques : Commit de design séparés des commits métiers...
Evènements
Les moteurs de jeux sont également utilisés dans l'audio visuel pour la création de films. L'ensemble des scènes est alors précalculé et la disposition de la caméra est choisie à l'avance. Il n'y a pas de place pour l'aléatoire.
Dans le cas des jeux vidéos, la caméra bouge. le sujet interagit avec son environnement qui est peuplé de centaines d'évènements. Ex : si une explosion survient dans le dos du joueur, il doit l'entendre avec plus ou moins d'intensité suivant la distance. Comment gérer autant d'évènements en même temps ? Comment gérer l'interaction entre les objets ? La programmation orientée objet est une des solutions utilisées. Elle permet de séparer encore plus les responsabilités, mais aussi de définir des interfaces de communication.
J'aime arpenter les jeux vidéos en pensant à la manière dont ils sont codés. Comment faire gérer les dégâts d'une voiture qui heurte un poteau plutôt qu'un mur ? Et même des fois dans l'autre sens. Qu'est-ce qui fait que je peux faire cela avec un protagoniste plutôt qu'avec un autre ? Qu'est-ce qui les sépare au niveau de leur code ? Ils se ressemblent, ils ont la même démarche mais leurs interactions sont différentes.
Nous pouvons pousser la réflexion encore plus loin et faire de même avec le monde qui nous entoure. Je me souviens d'une semaine très intensive de partiels de programmation orientée objet qui suivait plusieurs semaines de réflexions, expérimentations et révisions. La décompression du Vendredi soir avait été quelque peu inattendue. J'appliquais ce que j'avais appris à tout. Mon cerveau ne raisonnait qu'en objets, méthodes et interfaces. Quand je parlais à quelqu'un, j'imaginais que sa méthode getName() était bien implémentée pour qu'il me dise son nom...
Quelques articles
Bases et utilisations avancées du Javascript
Il y a certaines bases que nous connaissons sur le bout des doigts, d'autres que nous utilisons sans trop savoir et il y a celles que nous ignorons. Le Javascript évolue extrêmement vite. Afin de mettre tout le monde d'accord, je vous partage cette ressource qui vous aidera à élever votre niveau : Map, Set, this, coding style, promise...
Code Review
Vous voulez qu'on travaille ensemble ?
Un peu d'inspiration
Le moment des bonnes résolutions que nous ne tiendrons pas arrive. Une petite lecture qui ne peut pas faire de mal avec du à prendre et à laisser.