IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

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 !

CppCon 2014 - Le C++ dans les jeux triple A
Une vidéo de Nicolas Fleury montrant l'utilisation faite du C++ dans les jeux AAA

Le , par LittleWhite

0PARTAGES

7  1 
Nicolas Fleury, architecte logiciel à Ubisoft Montréal nous montre l'utilisation du C++ faites dans les jeux vidéos AAA.
Dans cette vidéo, vous comprendrez mieux les contraintes en termes de programmation d'un programme de jeu vidéo. En effet, malgré la multitudes de fonctionnalités dont dispose le C++, certaines sont à éviter.

Bonne vidéo.

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

Avatar de Nicolas Fleury
Membre à l'essai https://www.developpez.com
Le 04/01/2015 à 23:27
Je suis tombé sur cette discussion à mon retour de vacances, content de voir qu'on a pris de le temps de faire une discussion à partir de mon talk; c'est apprécié.

Si vous avez des questions, je peux prendre le temps d'y répondre.

J'ai parcouru la discussion et il y a quelques points que je peux adresser rapidement. Note: il y a certains termes que je ne vais pas traduire de l'anglais; par habitude, on les garde en anglais à Montréal.

On utilise beaucoup de fonctions virtuelles, c'est essentiel côté gameplay et pour une très grande majorité du code. C'est pour le 10% du code qui prend 90% du temps que c'est évité autant que possible, surtout pour le côté graphique. Et non, ce ne sera pas remplacé par des pointeurs de fonctions à ce moment-là, sinon c'est inutile. Ce sont les abstractions qui seront éliminées, dans le but d'améliorer l'utilisation de la cache. Le talk de Mike Acton au CppCon résume bien la problématique pour cette partie du code, entre autre avec un exemple où une grande majorité du temps est passé dans l'accès mémoire, ce qui laisse dans cet exemple peu au compilo à optimiser (). Oui, on pourrait dire que ce 10% va ressembler plus à du C, puisque typiquement les abstractions sont éliminées et que de simples PODs vont faire le travail, mais ce n'est pas le but, et on ne va pas se gêner pour utiliser des features C++ récents tant qu'ils sont disponibles sur tous les compilos de nos plates-formes. L'objectif est toujours de faire ce qui nous semble le mieux pour notre projet.

Il a eu des commentaires comme quoi Alexandrescu travaillerait davantage à faire travailler le compilo que nous pour optimiser. La première fois que je l'ai rencontré il y a une douzaine d'année, il avait effectivement présenté un concept hallucinant de métaprogrammation où un programme qui compilait n'aurait pas de deadlock. Mais aujourd'hui, il fait un travail similaire chez Facebook à ce qui se fait de notre côté. Il a d'ailleurs présenté cette année une implémentation à la main des tables des fonctions virtuelles pour avoir des performances légèrement supérieures, et une utilisation plutôt chiante, et c'est une direction dans laquelle je ne voudrais pas aller. On est tous les 2 devant le même problème: la vitesse d'accès de la mémoire n'a pas augmenté à la même vitesse que celles des processeurs, alors la mémoire se retrouve au coeur des performances.

On n'utilise pas de C# dans ce qui se retrouve dans le jeu final. Par contre, on considère que Unity 3D est un fabuleux moteur pour des prototypes ou pour des jeux où ses performances sont suffisantes. On l'utilise pour ces 2 cas chez Ubisoft, on ne va pas se mentir et se dire que nos moteurs monstrueux sont adéquats pour des prototypes si ce n'est pas le cas, quoique ça s'améliore.

Les plus anciens de l'industrie comme Mike Acton ne semblent pas aimer le C++, mais le coeur d'Ubisoft Montréal est plus jeune et a toujours travaillé en C++, je m'y inclus, et nous sommes intéressés par la direction qui est prise par le langage; certains d'entre nous discutent directement avec des membres du comité. Je conseille le talk de mon ami Jeff Preshing au CppCon, qui montre bien que le problème est souvent que ce dont on a besoin n'est pas disponible à temps ().

Je partage l'essentiel du point de vue de Titus Winters de Google sur leur vision du C++ (). Les features qu'ont exclut le sont simplement parce qu'on le juge dans notre intérêt.

Et oui, Assassin's Creed Unity et Rainbow Six: Siege utilisent le même moteur. Sur Assassin le code gameplay est immense et a beaucoup d'histoire.

Je suis d'accord que la realité de nos projets est différentes de plus petits projets. Plusieurs choix que l'on fait sont rentables à cause la grosseur de nos équipes.
14  0 
Avatar de tomlev
Rédacteur/Modérateur https://www.developpez.com
Le 28/12/2014 à 22:18
Citation Envoyé par Lolilolight Voir le message
Car le singleton n'est pas thread safe.
En quoi ce n'est pas thread-safe ? La seule partie du pattern singleton qui peut ne pas être thread-safe, c'est la création de l'instance unique ; mais si c'est implémenté correctement, c'est tout à fait thread-safe... Après, si l'objet singleton lui-même n'est pas thread-safe, c'est une autre histoire, mais ce n'est plus spécifique au pattern Singleton.

Citation Envoyé par Lolilolight Voir le message
sincèrement en tant qu'indé moi je me casse pas le cul je fais la même chose mais avec beaucoup moins de lignes de codes, et le tout, tout seul. (Ou au mieux à deux mais c'est rare)
Ben au moins tu te prends pas pour de la m***e
Il s'agit de jeux AAA, genre Assassin's Creed, Far Cry, Watch_Dogs, etc. Je serais curieux de voir un jeu comparable développé par toi tout seul...

Citation Envoyé par Lolilolight Voir le message
PS : les exceptions je trouve ça bête de ne pas les utiliser, surtout depuis qu'il y a les pointeurs intelligent, surtout que elles ne se lancent pas pendant la boucle de jeux en général mais plutôt lors du chargement de ressources ou de la sérialisation, je ne vois pas du tout en quoi ça pourrai gêné les performances.
Tu ne vois pas ? Ben eux ils voient ; s'ils ont décidé de se passer des exceptions, c'est pas par masochisme, c'est parce qu'ils ont fait des mesures, du profilage, etc, pour déterminer que ça nuisait aux perfs.

Citation Envoyé par Lolilolight Voir le message
Bref encore des arguments et un débats qui me semble, être du grand n'importe quoi.
Je te trouve un brin arrogant quand même
Quand tu auras fait un jeu AAA à toi tout seul, on en reparlera...
16  3 
Avatar de Luc Hermitte
Expert éminent sénior https://www.developpez.com
Le 02/01/2015 à 17:25
Du old school pour plein de choses en effet.

Citation Envoyé par tomlev Voir le message
Tu ne vois pas ? Ben eux ils voient ; s'ils ont décidé de se passer des exceptions, c'est pas par masochisme, c'est parce qu'ils ont fait des mesures, du profilage, etc, pour déterminer que ça nuisait aux perfs.
J'ai croisé pas mal d'arguments en défaveur des exceptions
- google> les développeurs n'y comprennent rien/ ne savent pas (/ne sauront jamais) écrire du code robuste => on les fuit (résultat ils considèrent les mallocs qui renvoient NULL comme des erreurs qui doivent planter les applications -- perso j'ai déjà eu à faire des allocations de tailles venant de l'extérieur (et donc non contrôlées) et toutes les allocations ne pouvaient pas aboutir (et bossant sur des softs critiques, on évite de planter chez nous))
- regoogle> on a une vieille base de code qui n'est pas exception-safe (la seule justification valide à mon gout)
- plein> mauvaises perfs
- AAA-console> la PSP-machin crashe à cause des exceptions (OK, c'est la seconde justification valide que je connaisse)

Pour les perfs, je ne suis pas convaincu. Il y a longtemps les compilos n'optimisaient pas le chemin nominal, et effectivement, ça coutait cher. Maintenant, le chemin nominal est optimisé. Résultats: un binaire plus gros et un sur-cout au lancement -- et des perfs médiocres dans les chemins non nominaux (et là, OSEF ce qui coute le plus cher dans un chemin non nominal, c'est l'utilisateur final qui va devoir régler le problème)). Seulement ... j'ai l'impression que ceux qui critiquent les exceptions ne mesurent jamais les performances du chemin nominal entre un code avec exceptions (et des catchs bien placés => en nombre restreint (merci le RAII)), et un code qui n'est pas au pays magique où les erreurs n'existent pas, c'est à dire d'un code qui a un if toutes les deux lignes. Il m'est avis que le problème est que c'est très difficile à comparer correctement. Il ne s'agit pas d'avoir des benchs de 50 lignes, mais des programmes plus pertinents avec des arbres d'appels de fonctions de jusqu'à quelques dizaines de niveaux de profondeur, avec des boucles, etc et qui remontent leurs erreurs), et écrire ces programmes en double demande du boulot pour avoir un bench fiable.

Pourquoi je suis plus que dubitatif : un if, c'est une prédiction de flot d'exécution qui peut foirer dans le pire des cas, voire pas de prédiction du tout parfois. Quand il y a un "if" entre deux call/gosub, cela fait beaucoup de prédictions qui peuvent foirer. Avec des exceptions, les tests n'ont lieu qu'aux seuls points où les erreurs peuvent être détectées. Cela fait beaucoup moins de tests. Ce qui fait qu'en nominal, cela devrait tracer bien plus vite.

On pourrait arguer qu'il ne devrait pas y avoir des cas exceptionnels dans un jeu vu qu'ils prennent la voie des optims de l'embarqué (toutes les allocations en début d'exécution), mais ... je n'y crois pas un seul instant : un câble peut-être retiré, et pouf, plus de joypad, plus de réseaux, ... Et puis d'ailleurs, ils ont implémenté leur propre système de dépilage de contexte, preuve en est qu'il y a toujours des cas exceptionnels à traiter. Cela veut-il dire qu'il ont fait le choix pays magique (pas de if), mais avec instrumentation avec leur système de surveillance de contexte ? Je serai curieux de savoir si leur code passe le test de robustesse décrit par Raymon Chen.
Et je pense à un autre élément, "noexcept" est parfaitement utilisable pour les zones du code où l'on peut s'attendre à ce qu'aucune entrée n'ait besoin d'être vérifiée (affichages, sorties audios, ...) -- je pense rejoindre Lolilolight là.

Bref je suis plus que dubitatif.

Sur le sujet:
- http://741mhz.com/exceptions-performance/ (une analyse des assembleurs produits, mais pas de bench associé)
- http://www.flounder.com/exceptions.htm (autre bench, mais la propagation d'erreur n'est pas mesurée, et il ne semble pas compiler avec un -fno-exception ou équivalent)
- http://stackoverflow.com/questions/3...es-in-c#307716 (autre analyse de l'assembleur)
- http://nwcpp.org/october-2006.html (une analyse de 2006 qui conclue qu'un code correct a des performances équivalentes à celles d'un code avec EH)

Concernant virtual, les branch-miss, & cie. Virtual devrait couter aussi cher que des tables de pointeurs de fonctions, car en interne c'est la même chose. De plus, virtual offre de meilleures performances que des if/switch à partir d'une demi-douzaine de cas (mais des benchs sont à faire pour chaque plateforme pour connaitre le seuil exact de chacune).
Mais ... avec ces ECS qui ont le vent en poupe (et qui viennent du monde du jeu si j'ai bien compris), reste-t-il tant de virtual que cela dans les codes des jeux ? Je ne suis pas sûr qu'il en reste beaucoup avec ce pattern.

PS: il y a eu plusieurs confs par des gens d'UBI soft ou autre AAA cette dernière année, et ils utilisent le C++11 notamment pour optimiser sauvagement des accès concurrentiels. Il n'y a pas que les amateurs qui exploitent des outils récents.
7  0 
Avatar de Luc Hermitte
Expert éminent sénior https://www.developpez.com
Le 03/01/2015 à 21:28
Là où je rejoins le clandestin chinois, c'est quand le débat sort du technique pour passer aux attaques ad hominen.
Ca gâche beaucoup de choses. A force trainer sur le net, ce genre d'attaques me font plus douter des arguments des attaquants que de ceux des attaqués -- ce qui n'est certainement pas le but recherché.

Bref, si vous devez ne pas être d'accord, restez concentrés sur le technique. On n'est pas sur un blog politique ou reddit ici, non ? (et encore, le reddit/cpp est d'assez bonne qualité je trouve -> ça trolle moins que ce à quoi je m'attendais)
7  0 
Avatar de foetus
Expert éminent sénior https://www.developpez.com
Le 04/01/2015 à 3:04
Citation Envoyé par TRUAN2LAGALERE Voir le message
C'est pas la peine de rager après les gros studios ricains
UBISoft = Union des Bretons Indépendants

Au fait, TRUAN2LAGALERE tu me mettras 2 t-shirts de côté

Citation Envoyé par Luc Hermitte Voir le message
La POO ? Un bonus quand j'en ai besoin. Ce n'est pas là que réside la différence majeure entre le C et le C++.

Les templates, un autre gros plus par rapport aux macros pour écrire des types abstraits et des algos génériques. Mais, cela reste un avantage qui ne détrône pas le RAII.
C'est pour cela que le C++ est considéré comme une boîte (ou une caisse) à outils: POO, template, héritage multiple, amitié ... copy/ swap pattern, ...

Mais certains n'arrivent pas à comprendre qu'on puisse coder en C++ sans ses outils et notamment juste en utilisant le principe de classe - RAII et l’encapsulation.
Ce n'est pas pour rien (du moins je le pense ) que les struct en C++ ce sont des classes avec une encapsulation publique.
7  0 
Avatar de Kannagi
Expert éminent sénior https://www.developpez.com
Le 23/12/2014 à 18:06
Après ce genre article est plus a titre informative pour ma part , mais un peu inutile pour le programmeur amateur/indépendant vu que cela n'est pas pareil en terme de projet et de code , je ferais un amalgame entre faire sa propre maison et faire un building de plus de 100 mètres de haut y a certes des points commun , mais certaine technique serait particulière au building (et inutile pour une simple maison).
7  1 
Avatar de Mat.M
Expert éminent sénior https://www.developpez.com
Le 28/12/2014 à 23:52
Citation Envoyé par Lolilolight Voir le message

Je trouve ça beaucoup plus propre de tout initialiser les entités au chargement et de tout détruire à la fin du programme, lorsque le contexte est détruit, plutôt que d'utiliser un singleton.
pour un jeu qui demande beaucoup de ressources en mémoire c'est une logique qui peut être risquée...
si tu as énormément d'entités et que tu alloues n milliers ou n millions d'entités d'un coup , soit l'OS refuse soit le jeu plante..
si tu as mettons 4 Go de RAM rien ne prouve qu'ils soient disponibles même en grande partie...
donc pour ce qui est des allocations et d'initialiser les entités il vaut mieux le faire progressivement...
Citation Envoyé par Lolilolight Voir le message

Le nombre d'employé et de développeur me semble énorme et le nombre de ligne de code également, sincèrement en tant qu'indé moi je me casse pas le cul je fais la même chose mais avec beaucoup moins de lignes de codes, et le tout, tout seul. (Ou au mieux à deux mais c'est rare)
un peu de bon sens ( je vais dans le sens de Tomlev) : un jeu développé par un indépendant n'a pas la même complexité qu'un jeu commercial AAA comme Assassin's Creed !
Tu travailles tout seul sur un jeu je suppose sur tes heures de loisir, Ubisoft Montreal c'est un paquet de salariés qui travaillent 40heures par semaine.
Ensuite pour ce qui est du nombre de lignes de code , rien que Irrlicht 3d voire SDL qui est Open Source c'est déjà tout un paquet de lignes de code..donc pour ce qui est de projets d'Ubi Soft..
7  1 
Avatar de Luc Hermitte
Expert éminent sénior https://www.developpez.com
Le 04/01/2015 à 2:10
Aller. Je vais répondre malgré le manque flagrant d'argumentation.
Citation Envoyé par CodeurPlusPlus Voir le message
Sinon je maintiens que C++ est un langage atrocement mal conçu qui fait office de religion d'état ; il y a quinze ans je défendais la POO à mort et en particulier C++, mais j'en suis bien revenu. Le C c'est bien, le C with classes aussi dans certains cas (il existe des problèmes qui se prêtent bien à une modélisation objet), mais le "vrai" C++, le C++ "moderne", celui qui fait haïr le C, c'est de la vraie merde.
Le C++ moderne, aka C++ avec RAII dans mon acceptation, est la chose qui fait que le C m'insupporte. J'ai autre chose à faire que de rendre mes codes illisibles et pénibles à maintenir à devoir gérer les libérations de ressources à la main. Comme d'hab, cf les deux codes robustes : celui à la C, et celui à la C++ qui sont donnés en fin d'article: http://alexandre-laurent.developpez....ou-exceptions/

La POO ? Un bonus quand j'en ai besoin. Ce n'est pas là que réside la différence majeure entre le C et le C++.

Les templates, un autre gros plus par rapport aux macros pour écrire des types abstraits et des algos génériques. Mais, cela reste un avantage qui ne détrône pas le RAII.

Du coup, le C ? Je le cantonne aux plateformes exotiques dépourvus de compilateurs C++, ou pour les rares cas où j'ai des problèmes d'ABI à résoudre.
6  0 
Avatar de white_tentacle
Membre émérite https://www.developpez.com
Le 21/04/2015 à 11:39
Citation Envoyé par DonQuiche Voir le message
Les causes les plus fréquentes de bogues sont connues depuis des décennies, elles ont été mesurées sur des centaines de millions de lignes de code, et c'est à l'aune de ces résultats que les langages ont évolué depuis le C++, par exemple avec la gestion automatisée de la mémoire (non, les smart pointers ne sont pas automatisés, seulement à moitié), les vérifications des indices des tableaux (ce qui permet de détecter rapidement et facilement les bogues), la vérification automatisée des références nulles, l'introduction de références non-nullables, et tant d'autres choses. On ne peut sérieusement contester qu'interdire ou mettre en évidence 75% des bogues débouche sur moins de bogues ! Il est absurde d'en voir certains ici soutenir ce genre de discours.
Je réponds quand même sur le point de la vérification automatisée des références nulles, c’est un problème assez amusant car c’est typiquement un problème introduit (problème qui concerne massivement C# et java) par un changement de paradigme destiné à régler d’autres problèmes... Comme quoi, les solutions « toutes prêtes » masquent toujours de nouveaux problèmes (même si, dans le cas de C# et Java, ils auraient pu mieux anticiper). C++ a des références non nullables… depuis le début en fait .

Sinon, des études ont montré que le nombre de bugs était uniquement fonction du nombre de lignes de codes et pas du langage utilisé, ce qui tendrait à donner un avantage aux langages dits « concis » tels que python, d’autres étude ont montré qu’il y avait plein de bugs en langage X et moins en langage Y, etc. Bref, on a lu tout et son contraire, et aujourd’hui, si quelqu’un prétend détenir « la » vérité, je crois que la seule bonne chose à faire c’est de lui rire au nez.

Si le C++ demeure utilisé c'est en dépit de son impact négatif, réel et mesuré, sur la productivité et la qualité du code.
En fait, pas forcément. Ça va peut-être te surprendre, mais on trouve deux familles chez les utilisateurs de C++. Ceux qui correspondent à ta description (la grande majorité), et ceux qui utilisent C++ parce que il leur apporte un bénéfice réel sur la productivité et la qualité du code. La grosse différence entre les deux familles : ceux de la deuxième maîtrisent beaucoup mieux leur outil, qui est effectivement d’un maniement complexe.

Le C++ est un langage ancien, problématique, toxique, qui reste malheureusement indispensable. Pour autant je pense qu'on va le voir de plus en plus rapidement remplacé par Rust pour les nouveaux développements, laissant ainsi le C++ rejoindre Cobol au rang de la seule maintenance.
Rust n’est même pas encore en version 1. Certes, les concepts derrière Rust sont plutôt bons, et il pourrait être une très bonne alternative, mais je me vois mal lancer aujourd’hui un projet sérieux dans un langage aussi peu répandu et abouti.

A contrario le code gameplay est typiquement une grosse gestion d'états, et ce genre de choses est toujours un nid de bogues. Et sans une forte hygiène (qui débouche malheureusement souvent sur un truc surarchitecturé) on obtient vite un fort couplage entre les différentes problématiques : le simple déplacement du joueur fait par exemple intervenir les entrées, l'environnement qui peut le ralentir, les collisions avec le monde, les buffs temporaires, le recul du fusil, l'interpolation réseau, etc. Autant dire des "if" par poignées de cent !
Au final, ça montre surtout que plus que le langage, c’est avant tout la conception (au service de la réduction de la complexité du problème) qui va diminuer le nombre de bugs.
5  0 
Avatar de Bousk
Rédacteur/Modérateur https://www.developpez.com
Le 30/12/2014 à 2:04
Citation Envoyé par Lolilolight Voir le message

Pas besoin de threads pour faire cela, des sockets non bloquants, et des timers suffisent.
Félicitations, avec ta technique de ouf -que t'es le premier au monde a imaginer- tu es maintenant interdit de sortir sur XOne qui interdit les sockets locaux, et Sony qui les déconseillé très fortement sur PS4.

D'autres idées de génie a balancer sans savoir comme ca ? Tu sembles avoir de la ressource a ce niveau.
6  2