Extension GDBench_Bridge | Perf x2.5

Bonjour à vous,

J’avais envie de vous communiquer le travail d’un dev d’extension (qui n’est pas moi) qui révolutionne un peu la 3D dans GDevelop.

Pourquoi suis-je allé chercher une extension pour gagner en performances ?

Dans le jeu que je développe actuellement (je vais vous joindre quelques images), je me suis retrouvé bloqué par le mur du lag.

Avec un groupe d’objets ayant environ 2 000 occurrences présentes dans la scène, je me retrouvais à avoir de sérieuses chutes d’FPS, disons 40/50 FPS avec ma config.

Autant dire qu’avec un PC beaucoup moins performant, c’était juste injouable. Chose que j’ai testée : j’ai rouvert un vieux PC qui a +10 ans, que j’ai dû forcer à passer sous Windows 11 via une clé Rufus, c’est pour dire.

Je vous joins la config en image jointe. J’étais à 10 images par seconde.

Je me suis alors dit : « Ça vient peut-être du PC, ou alors c’est tout simplement déjà un trop “gros jeu”. »

J’ai alors lancé un jeu Roblox qui me semblait « plus gros » que mon jeu actuel et là, le choc : j’avais 60 FPS sur ce PC tout naze.

J’interroge mon meilleur ami, Claude AI, pour me donner des pistes d’optimisation. Il me donne pas mal d’idées et me parle des draw calls (et de Three.js GPU).

GDevelop n’étant pas compatible avec Three.js GPU, j’ai dû me pencher sur la fusion de mesh de mes parterres de fleurs.

Voici un exemple : chaque parterre était un seul objet 3D, ce qui en fait, sur cette image, environ 1 500 objets.

J’ai donc fusionné le mesh en un seul objet 3D, ce qui ferait un seul draw call au lieu de 1 500.

Le problème

Le problème, c’est que GD ne permet pas d’agir sur un GLB (mesh d’un modèle 3D).

J’ai alors trouvé l’extension GDBench_Bridge, faite par Jiminus, qui permet d’agir sur :

  • les groupes

  • les locators

  • les meshes

Ainsi, au lieu de fonctionner en objets/groupes d’objets dans GD, je fonctionne uniquement avec des variables d’objet.

(C’est moins sexy côté dev, mais côté performances, c’est incroyable.)

Voici un exemple de construction d’un tableau de variables basé sur le GLB, fait sur Blockbench :

Et côté performances ?

Et bah, là, c’est assez incroyable.

Je suis passé, quoi qu’il arrive, à 60 FPS sur mon gros PC, mais aussi sur mon petit PC. Avec sa config très naze, je tourne a 30 FPS.

[Vidéo Avant/Après]

Remerciements

Merci à Jiminus d’avoir créé cette extension. Elle est bien plus complète que ce que j’ai indiqué ici.

Je sais qu’il travaille sur d’autres fonctionnalités, comme rendre une vitre ou de l’eau transparentes à la lumière. Ce qui veut dire qu’une fenêtre, dans un seul et même modèle 3D, pourrait laisser passer la lumière.

Vous pouvez retrouver son extension ici : https://jiminus-games.itch.io/gdbench-bridge

J’attends avec impatience le passage de GD à Three.js GPU pour pouvoir explorer plus loin les modèles 3D et aussi aller encore plus loin côté performances.

Petit à petit, Three.js dans GDevelop est mis à jour, et nous cherchons à terme à prendre en charge WebGPU. En attendant, afin de préparer le terrain, le profiler a récemment été enrichi avec des statistiques concernant les draw calls, les shader programs, etc.

À noter que le moteur ne fait pas encore d’instancing de meshes. Cela pourrait également améliorer les performances, puisqu’un seul mesh serait alors conservé en mémoire pour plusieurs instances. C’est également une amélioration que nous ciblons.

En tout cas, c’est vraiment encourageant de voir les progrès de ton jeu, aussi bien au niveau du développement que de l’optimisation. Les gains de performances avec l’extension sont spectaculaires. À l’avenir, tout cela sera inclus par défaut.