Unreal Engine: Blueprint vs C++

J’entends par­fois dire : les BP, c’est illis­i­ble… c’est plus lent… c’est gad­get… en pré­parant j’ai lu “si tu cherch­es à faire des choses plus sérieuses, le C++ est inévitable” sur un forum… que BP, c’est de la merde ! Et je souris… car quelques fois, j’ai pas envie de polémi­quer avec ceux qui ne le méri­tent pas – tout sim­ple­ment. J’ai beau­coup souri pen­dant les élec­tions français­es…

La Polémique n’en est pas une. Ou plutôt, qui n’en est plus une ! C’est essen­tielle­ment dû au passé, du moteur, à  la jeunesse des BP.  D’anciens dev ou des gens pas assez com­pé­tents pour com­pren­dre pourquoi… Parce qu’en école d’informatique on vous apprend la dif­férence entre inter­prété et com­pilé et que les gens con­fondent avec les BP.

Je vais essay­er de lever le voile sur tout ça. Nous allons analyser le prob­lème sous plusieurs angles: Sim­plic­ité, vitesse, lis­i­bil­ité, main­te­nance, API. A la fin, je ferai des recom­man­da­tions.

Simplicité

Par expéri­ence: les BPs plus sim­ple pour débu­tant, plus com­pliqué pour des gens maitrisant le C++ (ce qui est mon cas) – mais au final, on a le meilleur des 2 mon­des. J’explique pourquoi plus loin.

En C++, on peut faire des erreurs que l’on ne ferait pas en BP. Les BP sont bien plus con­trôlés par l’éditeur. On ne manip­ule pas de poin­teur – tout du moins, rien qui nous per­me­t­trait d’aller écrire n’importe où en mémoire… c’est plus sécurisé. En BP, si Unre­al plante, c’est cer­taine­ment parce qu’il y a bogue dans le moteur. En C++, c’est sou­vent parce qu’on n’a mal codé un truc (en plus des bogues d’Unreal). Et on peut chercher longtemps en C++…

Vitesse

Inter­prété con­tre com­pilé ? Il faut bien com­pren­dre ce qui se cache der­rière ces ter­mes. L’image de l’interprète dans la vie de tous les jours, c’est à dire le tra­duc­teur, est assez bonne. Si vous par­lez à un chi­nois en pas­sant part un inter­prète, vous devrez par­ler en français, et lui traduira en chi­nois… c’est for­cé­ment plus long ! C’est pareil avec un lan­gage infor­ma­tique inter­prété. La machine ne le com­prends pas directe­ment, alors on utilise un logi­ciel, un inter­pré­teur dans ce cas, qui va traduire chaque ligne et exé­cuter le code équiv­a­lent. Car lui, ce pro­gramme, est directe­ment un exé­cutable, c’est à dire qu’il est en lan­gage “machine”, une suite de 0 et de 1 que le processeur com­prend par­faite­ment.

Cet inter­pré­teur a t-il était écrit en assem­bleur ? Déjà, l’assembleur n’est pas un lan­gage que la machine com­prend, mais il en est très proche. Même l’assembleur… s’assemble — on ne par­le plus de com­pi­la­tion pour lui, même si le principe est respec­té. Un inter­pré­teur est écrit dans un lan­gage com­pi­l­able… ça sig­ni­fie que son code source va être traduit en lan­gage machine pour créer un exé­cutable. Le C++ est un lan­gage que l’on com­pile. Le C#, celui qui est util­isé par Uni­ty, est un lan­gage qui passe par une machine virtuelle… enfin, un équiv­a­lent. Mais nous n’allons pas entr­er là dedans, ça nous forcerait à par­ler de Just In Time et autres sub­til­ités.

Python est con­sid­éré comme un lan­gage de script. Pour­tant, cython per­met de trans­former du code python de telle façon qu’on puisse le com­pil­er en exé­cutable (en pas­sant par le C). Et je ne par­le pas d’embarquer un inter­pré­teur python dans l’exe ! Non, au final, le pro­gramme est “qua­si­ment” aus­si per­for­mant en terme de vitesse d’exécution qu’un pro­gramme écrit directe­ment en C.

Alors, pourquoi Epic Games n’a pas trans­for­mé les BP en code C++ pour pou­voir les com­pil­er  ? Ben, c’est exacte­ment ce qu’ils ont fait.

Sous l’éditeur, les BP sont inter­prétés, ils sont donc plus lents… depuis une ver­sion assez récente, je crois que c’est postérieur à la 4.10, il est pos­si­ble de trans­former les BP en code C++, de com­pil­er ce code et de l’insérer dans le pack­age. C’est le procédé de “Nativiza­tion”, à ne pas con­fon­dre avec la com­pi­la­tion stan­dard des BP qui con­siste à trans­former le BP en Byte­code inter­prété par une VM.

Le “Nativiza­tion” peut être activé à tout moment, mais cela ne va que dans un seul sens. Soit vous le faites à la fin, juste pour le Build et vous gardez les BP ain­si pour la main­te­nance du code. Soit vous trans­formez à n’importe quel moment vos class­es BP en C++. Plus d’infos sur cette page.

Bémol: Un BP com­pilé aura ain­si la même vitesse que son équiv­a­lent C++ une fois com­pilé, à un détail près: la com­pé­tence du développeur. Ex: Faite une boucle 100.000x et appelez une fonc­tion qui en appele d’autres… et com­par­er cela à appel­er une macro… ce n’est pas le même résul­tat au final. C’est pire avec les fonc­tions qui s’appellent elles-mêmes. Mais on peut faire les mêmes con­ner­ies en C++.

De même, un com­pi­la­teur C++ est capa­ble d’optimiser des choses aux­quelles on ne penserait même pas en assem­bleur. C’est vrai aus­si pour les Blue­prints. Les développeurs qui bossent sur l’Engine, surtout depuis qu’il est Open Source, sont suff­isam­ment géni­aux pour faire en sorte d’optimiser de façon très intel­li­gente des boucles, en sub­sti­tu­ant des macros à des fonc­tions quand ces dernières sont petites, à réécrire des fonc­tions faisant appel à de la récur­siv­ité… ce qui ne sera pas for­cé­ment le cas avec votre code C++

Quand j’étais à l’IUT Infor­ma­tique… il y a fort longtemps, dans un pays très froid où il pleut tout le temps… où les gens boivent pour oubli­er… bon je m’arrête ici… bref, on me dis­ait à l’époque, et le prof était un gars très capa­ble car il fab­ri­quait des robots high tech pour l’armée, que le com­pi­la­teur pro­duisant le code le plus rapi­de du monde n’était pas un com­pi­la­teur C, mais un com­pi­la­teur ADA ! WTF??? C’est pas pos­si­ble… cette merde de lan­gage où il faut tout déclar­er, ou on n’a pas de poin­teur.… beurk… beurk et rebeurk… Mais il avait rai­son. C’est un lan­gage très con­traint, très sécurisé… Et de ce fait, les développeur géni­aux du meilleur com­pi­la­teur avait pu faire des opti­mi­sa­tions qu’ils n’auraient jamais pu faire en C. Tout s’explique, mais c’est con­traire à l’intuition.

Maintenance du code

On peut écrire sale­ment du C++ comme des BP.

Les BP, selon les cas, ça peut devenir très fouil­lis. Dans ce cas, faire une rou­tine C++.

En prog, 2 grands secrets: divis­er pour mieux régn­er, et simplifier/complexifier – Et un 3ième, com­mentez, mais pas trop. Le secret de l’élixir, c’est quand il n’y a plus rien à retir­er – idem en BP, idem en C++.

Par expéri­ence, un code C++ et un Blue­print, sont aus­si dif­fi­ciles à main­tenir pour un dev expéri­men­té. Dans la semaine, c’est nick­el. 3 mois après, on se grat­te la tête. Mais on y arrive, dans les deux cas.

Les BP sont plus facile à déboger: voir ces liens s’illuminer, pou­voir zoomer dans un arbre de déci­sion d’IA, gér­er par con­troller, etc. L’éditeur est super en ce sens ! Dis­ons que c’est plus ludique.

J’ai eu l’occasion de boss­er dans plusieurs équipes: c’est plus facile de faire appli­quer des règles sim­ples de codage en BP qu’en C++. Le BP est plus imper­son­nel et il est donc plus facile de s’approprier le code d’un autre. De même, le mélange entre dev, artistes et d’autres inter­venants donne plus d’interactivité à l’équipe.… le codeur est moins perçu comme un dic­ta­teur, seul dieu du coeur du sys­tème… il tombe un peu de son piédestal (mer­ci Alkher)… mais au final, tout le monde par­ticipe et on entend un peu moins de “c’est pas pos­si­ble… de toute façon, t’y con­nais rien, t’es un batard de graphiste”… Promis, ces mots ne sor­tent pas de ma bouche, mais je les ai enten­dus durant une bat­tle en demo­mak­ing… Per­so, j’ai une grande admi­ra­tion pour les gens créat­ifs et pour ce dont sont capa­bles les graphistes… grâce à eux, on con­stru­it des mon­des mag­nifiques et qui me font rêver… mais je m’égare.

API

Si 95% (à la louche) des fonc­tions de l’API d’Unreal Engine sont exposées en Blue­prints, reste 5% qui ne l’est pas. Dans ce cas, il peut être néces­saire de pass­er par le C++. Exem­ple dans mon tome 5, j’utilise un plu­g­in pour palier à cer­tains man­ques des Blue­prints, mais ce n’est que pour map­per des fonc­tions du moteur qui exis­tent en C++.

Conclusion

Non, BP ce n’est pas que pour le pro­to­ty­page. D’ailleurs je trou­ve ça un peu absurde, car cela sig­ni­fie qu’il faut tout recoder. Oui, réécrire quelques fonc­tions cri­tiques… et encore.

Cer­taines fonc­tions doivent être dévelop­pées en C++: c’est plus sim­ple – et plus rapi­de à dév comme à exé­cuter. Exem­ple: vous devez créer une matrice et effectuer un tri avec des opéra­tions… Vous voulez utilis­er des listes chainées, des poin­teurs… etc. Pour faire de l’IA aus­si c’est plus pra­tique, si les fonc­tions d’Unreal ne suff­isent pas. Sachez qu’en 4.16, vous avez un plu­g­in en bêta qui per­met de faire des struc­tures de struc­tures ! Struct­Box !

Il doit rester des cas où le BP est mal traduit en C++, donc plus lent à l’exécution, mais cela doit rester rare et cela sera cor­rigé avec le temps. Pas encore vu de mon coté.

Il faut con­sid­ér­er les Blue­prints comme un lan­gage de plus haut niveau que le C++: con­stituer une API avec des fonc­tions et des objets dévelop­pées en C++.

C++, c’est l’ouver­ture vers le monde extérieur à UNREAL ENGINE. Exem­ple: utilis­er CUDA pour faire du cal­cul par­al­lèle.… Faire appel à OpenCV pour de la recon­nais­sance d’images.

Je met au défi un développeur de déter­min­er, dans un Build com­pilé avec les bonnes options, s’il s’agit de BP ou de C++ — Car, tout du moins, en terme de perfs, le résul­tat est vrai­ment très proche, à com­pé­tence de dev égale. Je par­le de perfs, car dans le binaire, dans les logs, il reste des traces.

Quand on est en stu­dio, c’est génial: les dev out­ils éten­dent les Blue­prints, les autres dev, comme le game dev, voire le game et lev­el design­er et les graphistes peu­vent créer ou mod­i­fi­er des Blue­prints, c’est Top !Je con­nais des gars qui bossent sur des matéri­aux et qui font des fonc­tions que j’arrive à peine à com­pren­dre… les gars sont très doués, c’est qua­si­ment un méti­er, développeur de matéri­aux ! Je pense à toi Marien si tu pass­es par là. Et tout ça à plusieurs en même temps en util­isant un out­il comme per­force.

Donc, oui, je recom­mande aux débu­tants comme aux devs con­fir­més d’apprendre les BP et de les utilis­er abon­dam­ment. Les pre­miers y ver­ront un accès sim­pli­fié à ce qu’est la pro­gram­ma­tion. S’ils veu­lent toute­fois être bons pour créer des BP per­for­mants, il leur fau­dra dévelop­per toute­fois des com­pé­tences en pro­gram­ma­tion, en algo­rith­mique, etc. On ne code bien en BP que si on a des com­pé­tences en algo­rith­mique, mais égale­ment si on sait com­ment fonc­tionne un com­pi­la­teur et l’assembleur. Un CPU, un GPU … ce qu’est un garbage col­lec­tor par exem­ple, car UE4 en utilise un.

Quant aux sec­onds, ils pour­ront utilis­er le meilleur des 2 mon­des et c’est vrai­ment le pied ! Plus aucune lim­ite à Unre­al Engine, de belles fonc­tions à appel­er en BP… y-a même un com­merce der­rière cela, car les dev con­fir­més peu­vent ven­dre les librairies dévelop­pées sous forme de plu­g­ins et util­is­ables par des débu­tants en BP. C’est du mid­dle­ware.

Et si vous n’êtes pas un pro du C++, restez au Blue­print ! Vous fer­ez moins de dégâts… Non, sans dec !

Voilà, j’espère avoir été com­préhen­si­ble par toutes et par tous… ce n’est pas tou­jours évi­dent. J’ai l’impression de ne pas avoir fait com­plète­ment le tour du sujet.. j’aurais voulu vous dire que der­rière les Blue­prints vous avez des dev expéri­men­tés qui opti­misent un max… je ne serai pas éton­né qu’ils soient capa­ble de // le code d’ici quelques temps, d’envoyer une par­tie des BP dans le GPU… à l’instar d’ADA – plus un lan­gage est “pro­tégé”, plus on peut l’accéléré, prédire les sor­ties, etc.

Si vous voulez un tome sur le C++, mer­ci d’en faire part à l’éditeur car il n’y pas de plan pour l’instant ! Les ventes sur le mul­ti­joueurs et le réseau com­men­cent à arriv­er, mais le tome décolle moins vite que les autres… il est plus effrayant ! ^^

2 réflexions sur « Unreal Engine: Blueprint vs C++ »

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.