Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

« Pourquoi le C est mon meilleur choix pour programmer des jeux vidéo », d'après un travailleur de la filière
Qui s'appuie aussi sur le C++ pour ses projets commerciaux

Le , par Patrick Ruiz

48PARTAGES

27  0 
Dans la filière jeux vidéo comme dans de nombreux autres domaines où les solutions prennent principalement la forme de programmes informatiques, le choix du langage de programmation est l’un des aspects auquel les intervenants n’échappent pas. En fonction de l’objectif à atteindre, à chacun sa liste de critères.

Un programmeur peut requérir d’un langage de programmation qu’il soit fiable c’est-à-dire qu’il permette de garder la main sur le contrôle des bogues. La nécessité de s’affranchir de la dépendance à un système d’exploitation en particulier peut aussi rentrer en ligne de compte. En sus, il y a des facteurs comme la simplicité ou le choix de paradigmes de programmation qui sont susceptibles d’intervenir. Jonathan Whiting – un travailleur de la filière programmation de jeux vidéo – cite ces critères (parmi d’autres) pour désigner le langage C comme son meilleur choix pour la programmation de jeux vidéo.

« Il y a des choses qui ne sont pas négociables. Tout d'abord, le langage de programmation doit être fiable. Je ne peux pas me permettre de passer mon temps à m'occuper de bogues que je n'ai pas causés moi-même. De plus, je veux éviter de me lier à un système d’exploitation particulier et dans l'idéal j'aimerais avoir la possibilité de développer pour les consoles. Il est donc important que mon langage de programmation dispose d'une bonne prise en charge de bibliothèques portables. L’aspect le plus important sur ma liste est la simplicité : le langage idéal est celui que je peux mémoriser avec aisance, ce qui permettrait de ne pas avoir à consulter de la documentation tout le temps. Gérer les bugs est un énorme gouffre créatif. Je veux pouvoir générer moins de bogues, donc je veux un typage fort, des messages d'avertissement stricts et une analyse statique du code. Je veux que les bogues soient plus faciles à trouver ce qui nécessite de disposer de bons outils de débogage. Je me soucie encore plus de la vitesse du compilateur. Je ne suis pas un maître zen de la concentration et attendre plus de 10 secondes est une perte de temps, oui, mais plus important encore, cela me brise le rythme. Dans des cas d’attente de ce type, je passe sous Twitter et la conséquence est que c’est plus de 5 minutes de gaspillées. Enfin, je ne suis pas fan de programmation orientée objet. J'ai passé la majeure partie de ma vie professionnelle à travailler avec des classes et des objets, mais plus je passe de temps, moins je comprends pourquoi on doit combiner le code et les données de manière aussi rigide. Je veux traiter les données comme des données et écrire le code qui convient le mieux à une situation particulière », précise-t-il.


En matière de programmation de jeux vidéo, l’un des débats de fond porte sur la gestion de la mémoire. La plupart des langages de programmation dont on fait usage dans la filière s’appuient sur des ramasse-miettes. Seulement, les retours à propos de leur utilisation font état de ce que le programmeur perd le contrôle sur les périodes d’allocation et de libération des zones de mémoires par le Garbage Collector. Cet état de choses pose le problème de la gestion de certains aspects temps réel. Pour résoudre le problème, certaines équipes de développement proposent de revenir à une gestion manuelle des allocations et libérations des zones de mémoire. Des cas de figure de ce type positionnent le langage C dans la liste de ceux susceptibles de faire l’affaire.

C’est pour autant de raisons que Whiting code ses jeux dans un C « vanilla », c’est-à-dire épuré dont les programmeurs disposent dans d’autres langages (frameworks, …). Il y a seulement que son développement laisse filtrer qu’il s’appuie sur le langage C dans le cadre de projets personnels. Toutefois, il reconnaît qu’il fait plutôt usage du langage C++ pour la plupart de ses projets commerciaux.

« Le langage C++ couvre mes besoins, mais est loin de respecter mes critères en matière de choix de langage de programmation pour le développement de jeux vidéo. C'est un langage très compliqué. Malgré la disponibilité de bons outils, il est facile de créer des bogues en s'appuyant sur ce dernier. Il est également lent à compiler comparé à C. Il est cependant très performant et offre des fonctionnalités dont le langage C ne dispose pas », écrit-il.

Aux langages C# et Java, Withing oppose la simplicité du langage C qui se traduit par la non-nécessité d’embrasser des paradigmes de programmation « complexes » comme la programmation orientée objet. « Comme la plupart des langages évolués, ils ont tendance à cacher la complexité d'une manière qui ne l'empêche pas de vous mordre », lance-t-il.

La programmation de jeux vidéo est aussi une histoire de plateforme cible. Si l’on veut écrire des programmes pour de vieilles machines (Game Boy, Amiga, Atari) alors les possibilités de faire autrement qu’avec l’assembleur deviennent très minces. Avec l’aura actuelle de la plateforme Android, des langages comme Java ou Kotlin arrivent à se tailler des parts de marché même si l'on attribue au C++ le fauteuil de langage par excellence des jeux vidéo.

Source : billet de blog

Et vous ?

Quel est votre meilleur choix de langage pour programmer des jeux vidéo ? Quelles sont vos raisons ?

Quels sont les aspects du langage C susceptibles de vous amener à le citer comme votre meilleur choix en matière de programmation de jeux vidéo ?

Voir aussi :

Quel avenir pour le langage C ? Un développeur expérimenté fait ses adieux au langage et livre ses inquiétudes quant à son avenir

C2 : un langage qui se présente comme une évolution de C, plus rapide, sans fichiers d'en-tête, avec système de build intégré et d'autres changements

Quel langage pourrait remplacer C ? Après avoir comparé Go, Rust et D, le choix d'Andrei Alexandrescu se porte sur D

Pourquoi les langages C et C++ auraient-ils encore de nombreuses années devant eux ? Donnez votre avis

Une erreur dans cette actualité ? Signalez-le nous !

Avatar de iclo
Membre régulier https://www.developpez.com
Le 23/09/2019 à 10:14
Si on regarde ça d'un point de vue pur "C ou C++" oui, la question se borne à un garde-fou au niveau de programmation.
Si on étend la réflexion aux autres langages tels que Java, je trouve qu'elle devient plus interessante : le fait de ne plus (presque) jamais rien désalloué explicitement à tendance à gommer chez certains développeurs la conscience qu'un programme informatique consomme de la mémoire pour s'exécuter, que cette ressource n'est pas infinie et que la manière de la consommer peut avoir un sérieux impact sur les performances. J'ai connu des programmes ramant fortement car allouant / désallouant massivement : le développeur n'était même pas conscient que cette mauvaise pratique provoquait des démarrages bien trop fréquence du garbage collector et donc plombait les performances.

C'est le danger des langers dit de "haut niveau" : certains pertes consciences de ce qui tourne en dessous. Au risque de me faire lyncher : est-il raisonnable de former des développeurs uniquement sur des langages de haut-niveaux sans les faire passer par du C pur ou même de l'Assembler, histoire de triffouiller dans les tripes de la bête et en garder une compréhension quand ils développerons avec n'importe quel autre langage par la suite.
17  0 
Avatar de Xurudragon
Membre du Club https://www.developpez.com
Le 23/09/2019 à 11:49
Citation Envoyé par Leruas  Voir le message
Impossible de faire des jeux 3D modernes avec du C uniquement.

Citation Envoyé par Leruas  Voir le message
Il fait juste des jeux 2D retro au graphisme des années 80, voilà pourquoi ça lui suffit.

J'aimerais bien connaitre tes arguments selon lesquels il est impossible de faire des jeux en 3D avec du C...
6  0 
Avatar de Markand
Membre confirmé https://www.developpez.com
Le 23/09/2019 à 14:22
Citation Envoyé par Leruas Voir le message
Impossible de faire des jeux 3D modernes avec du C uniquement.
Il fait juste des jeux 2D retro au graphisme des années 80, voilà pourquoi ça lui suffit.
En fait il est même possible de faires des jeux 3D en assembleur même.

Ah et Doom, wolfenstein, Quake 1, Quake 2, Quake 3 sont tous écrit en C
7  1 
Avatar de micka132
Expert confirmé https://www.developpez.com
Le 23/09/2019 à 10:57
Citation Envoyé par iclo Voir le message
le fait de ne plus (presque) jamais rien désalloué explicitement à tendance à gommer chez certains développeurs la conscience qu'un programme informatique consomme de la mémoire pour s'exécuter, que cette ressource n'est pas infinie et que la manière de la consommer peut avoir un sérieux impact sur les performances.
C'est vrai, mais la difficulté de la gestion manuelle de la mémoire est exponentielle avec le nombre de développeur.
En gros un dev seul sait à peu prés où et quand il instancie les objets et quand il doit les détruires. C'est beaucoup moins vrai lorsque tu commences à t'interfacer avec d'autre bout de programme qui ont des objets en paramètre de méthode (qu'est-ce qu'ils trafiquent avec?). Pour améliorer la productivité il y a donc des artifices, des fois des ramasses miettes, ou bien les smart pointeurs en C++.

Mais je pense surtout que l'explosion de l'utilisation de mémoire est dû à la multiplication de l'utilisation de brique (framework), où bien souvent seule une toute petite partie est utilisée. Là aussi, pour des besoins de productivités on ajoute des couches.
Tant que l'hardware suit...mais avec la mode écolo il ne serait pas étonnant que l'on revienne un peu en arrière. Ca serait sympas parce que franchement ça me casse les ***** de passer plus de temps à chercher puis à intégrer des modules que de vraiment développer.
5  0 
Avatar de Aurelien.Regat-Barrel
Expert éminent sénior https://www.developpez.com
Le 23/09/2019 à 12:06
Citation Envoyé par SofEvans Voir le message
le ramasse miette n'est-il pas simplement un garde-fou contre les fuites de mémoire ?
Normalement, on a toujours la main sur l'allocation (via "new" ou même "malloc" en C++) et la désallocation (via "delete" ou "free" en C++), non ?
[...]
La présence d'un ramassa-miette pourrait à la rigueur pousser les dev à faire du code pas joli-joli concernant l'apect "utilisation de la mémoire" (j'ai déjà vu une ouverture de fichier dans une fonction sans fermeture du-dit fichier, et la seule réponse du dev c'était "le ramasse-miette s'en charge, pas besoin de se prendre la tête" ...), mais sinon il devrait être tout a fait possible dans certains langage comme le C++ de garder entièrement le contrôle.
En effet le GC n'est pas une solution générique au problème de la gestion des ressources mais une réponse spécifique à la mémoire. On ne peut pas s'appuyer sur un GC pour gérer ses mutex, fichiers, socket, etc... sous peine de faire à divers problèmes.

L'approche du C++ dit "moderne" est le RAII : encapsuler la gestion de la durée de vie dans un objet qui, d'une certaine façon, fait le boulot d'un garbage collector primitif (de type Automatic Reference Counting).
https://github.com/isocpp/CppCoreGui...nes.md#Rr-raii

C'est une solution générique à tout type de ressource qui offre de nombreux avantages y compris en termes de perf (chaque thread gère sa ressource dispo dans son cache au lieu de déléguer à un GC qui doit bosser dur dur sur un 32 coeurs, pas besoin d'hériter d'un objet racine lourd à la System.Object ou QObject, possibilité d'utiliser la pile au lieu de devoir systématiquement faire une alloc sur le heap via new, etc...), mais nécessite la présence d'un destructeur déterministe à la C++ pour fonctionner. Son inconvénient ? Il faut coder son propre objet utilitaire si on ne peut pas faire avec ce qui existe en standard (shared pointers, mutex locker, etc...). C'est donc contre la flem du programmeur qu'il faut se battre, et c'est pas une mince affaire Il faut aussi se poser la question de la propriété de l'objet, qui est en soit une très bonne question à se poser en terme de design de code. Malheureusement c'est pas vraiment dans la culture. En effet, une des conséquences néfaste d'un GC est de pousser à avoir des pointeurs partout dans le code ce qui revient, in fine, à avoir des variables globales déguisées. C'est bien plus pratique à trimballer dans le code là où on en a besoin. Par contre, pour avoir les idées claires sur qui fait quoi exactement, c'est une autre histoire.

Du coup, depuis C++14 (et la standardisation de std::make_unique), non seulement les "naked delete" mais même l'utilisation directe de "new" est considérée comme du code smell en C++ : on préfère passer par un objet ou fonction utilitaire qui encapsule cet appel de telle façon que son appel miroir à delete est garanti, de façon automatisée. Cette encapsulation peut être faite de telle façon que le partage de propriété de l'objet est interdit. Tout ça renforce la robustesse du code, mais ce sont des notions qui, semble-t-il, sont trop pénibles à assimiler pour beaucoup de devs. Peut être que Rust aidera à populariser ces idées.
5  0 
Avatar de Guntha
Membre éprouvé https://www.developpez.com
Le 23/09/2019 à 10:50
Citation Envoyé par walfrat Voir le message

La "simplicité du C" : du langage peut-être, cependant contrôler manuellement toute la gestion de la mémoire est une tâche relativement ardû.
Dans le cas des jeux (ce qui est le cas de l'auteur ici): en général on n'a pas à "gérer" de la mémoire, on connaît son budget à l'avance et on n'alloue ou ne libère quasiment rien une fois le jeu initialisé. À une époque, les consoliers exigeaient qu'un jeu puisse tourner 24h d'affilée sans planter (pour pouvoir être lancé sur des bornes de démos dans les magasins, sans planter au milieu de la journée), c'était d'autant plus nécessaire d'éviter la fragmentation :p

Théoriquement, ça serait possible de faire la même chose en Java/C#, mais quand on sait qu'une itération d'un foreach peut générer du garbage dans certains cas, ça ne donne pas confiance dans le langage...

Pour répondre au questions du 1er post:
Citation Envoyé par Patrick Ruiz Voir le message

Quel est votre meilleur choix de langage pour programmer des jeux vidéos ? Quelles sont vos raisons ?
Aujourd'hui, j'utilise du C ou du C++ avec un très petit sous-ensemble de features (surcharge d'opérateurs, méthodes...).
Peut-être que Jai ou un autre changera la donne. Rust semble aussi intéressant.

Citation Envoyé par Patrick Ruiz Voir le message

Quels sont les aspects du langage C susceptibles de vous amener à le citer comme votre meilleur choix en matière de programmation de jeux vidéo ?
Le fait que tout ce qu'on fait est explicitement écrit, et le langage est facilement débuggable. Et le fait que presque toutes les bibliothèques soient compatibles C. Le seul défaut que je vois, c'est si on essaie de faire des trucs génériques à coups de macros, ça fait voler en éclat la "débuggabilité". (C'est pour la même raison que j'évite autant que possible d'utiliser des templates en C++...)

Je ne le vois pas beaucoup cité sur le topic, mais le temps de compil est de plus en plus important pour moi: ça devient pénible de travailler sur des projets où on doit attendre plusieurs dizaines de secondes avant de pouvoir débugger.
3  0 
Avatar de SofEvans
Membre chevronné https://www.developpez.com
Le 23/09/2019 à 10:02
En matière de programmation de jeux vidéo, l’un des débats de fond porte sur la gestion de la mémoire. La plupart des langages de programmation dont on fait usage dans la filière s’appuient sur des ramasse-miettes. Seulement, les retours à propos de leur utilisation font état de ce que le programmeur perd le contrôle sur les périodes d’allocation et de libération des zones de mémoires par le Garbage Collector. Cet état de choses pose le problème de la gestion de certains aspects temps réel. Pour résoudre le problème, certaines équipes de développement proposent de revenir à une gestion manuelle des allocations et libérations des zones de mémoire. Des cas de figure de ce type positionnent le langage C dans la liste de ceux susceptibles de faire l’affaire.
Oula, j'ai dû hyper-hiberner ou louper quelque chose de fondamentale, mais le ramasse miette n'est-il pas simplement un garde-fou contre les fuites de mémoire ?
Normalement, on a toujours la main sur l'allocation (via "new" ou même "malloc" en C++) et la désallocation (via "delete" ou "free" en C++), non ?

Donc qu'on utilise le C ou le C++, sur cet aspect des choses, c'est censé être kiff-kiff, non ?

La présence d'un ramassa-miette pourrait à la rigueur pousser les dev à faire du code pas joli-joli concernant l'apect "utilisation de la mémoire" (j'ai déjà vu une ouverture de fichier dans une fonction sans fermeture du-dit fichier, et la seule réponse du dev c'était "le ramasse-miette s'en charge, pas besoin de se prendre la tête" ...), mais sinon il devrait être tout a fait possible dans certains langage comme le C++ de garder entièrement le contrôle.
Même en php, tu peux utiliser "unset" pour dégager les "allocation" mémoire que tu as fait.

Du coup, j'ai du mal à comprendre le choix du C uniquement sur l'aspect "contrôle de la mémoire".
J'ai loupé un truc ?
3  2 
Avatar de walfrat
Membre actif https://www.developpez.com
Le 23/09/2019 à 10:15
J'ai un peu de mal avec ses arguments.

La "simplicité du C" : du langage peut-être, cependant contrôler manuellement toute la gestion de la mémoire est une tâche relativement ardû.
L'IoC fournit par certaine technos sont aussi très utile pour ne pas avoir a gérer ça soi-même (et pouvoir facilement switcher d'un mode "prod" à un mode "tests".

En outre dire que l'on doit embrasser l'objet pour faire du Java/C# est un peu exagérée. Beaucoup de framework sont sur une base MVC, hors le MVC est plutôt vu comme l'impératif façon "objet" que comme de la vrai POO. (ex : https://www.yegor256.com/2016/12/13/...vc-vs-oop.html).

En bref je ne suis pas contre me faire dire que C/C++ est mieux pour le jeu vidéo, mais les arguments avancés me semblent pas pertinent ici.


Si on étend la réflexion aux autres langages tels que Java, je trouve qu'elle devient plus interessante : le fait de ne plus (presque) jamais rien désalloué explicitement à tendance à gommer chez certains développeurs la conscience qu'un programme informatique consomme de la mémoire pour s'exécuter, que cette ressource n'est pas infinie et que la manière de la consommer peut avoir un sérieux impact sur les performances. J'ai connu des programmes ramant fortement car allouant / désallouant massivement : le développeur n'était même pas conscient que cette mauvaise pratique provoquait des démarrages bien trop fréquence du garbage collector et donc plombait les performances.
Attention, dans les récent "récente" de Java par exemple (7+) le GC a depuis été très optimisé pour gérer des objets à durée de vite très courte. Personnelement je ne m'en prive pas, soit mes objets ont une durée de vie très courte, soit elle est longue, j'évite l'entre deux cela dit. Enfin comme la mémoire est alloué par bloc, les new en Java ne sont pas des équivalents à malloc.
3  2 
Avatar de micka132
Expert confirmé https://www.developpez.com
Le 23/09/2019 à 11:54
Citation Envoyé par walfrat Voir le message
Bien que je plussoie la remarque que l'intégration c'est pas le plus passionant, d'autres pourrait t'objecter que ça leur casse les ****** de se taper un énième framework/librairie maison alors qu'à l'époque il y avait déjà mieux dehors
Ça c'était avant l'explosion du web . Entre les outils css, les outils js, les moulinettes html, les packagers, et même les gestionnaires de paquets qui se tirent la bourre, il n'y a pas une entreprise qui à la même chaine d'outil! D'autant qu'il y a des nouveautés chaque semaine ou presque rendant les autres has-been.
Petite blague :
https://www.reddit.com/r/ProgrammerH..._the_universe/
1  0 
Avatar de LittleWhite
Responsable 2D/3D/Jeux https://www.developpez.com
Le 23/09/2019 à 15:14
Citation Envoyé par Markand Voir le message
En fait il est même possible de faires des jeux 3D en assembleur même.
Euh, sauf que le Roller Coaster Tycoon en question, c'est un jeu sorti en 1999 et qu'il n'est pas en 3D, mais en 2D isométrique.
1  0