Learn · concepts

Qu'est-ce qu'ImGui ? ImGui expliqué

ImGui (Dear ImGui) est une bibliothèque d'interface graphique immédiate pour C++. Elle dessine les menus à chaque image sans arbre de widgets conservé, ce qui est courant dans les outils de jeux et les clients natifs.

TRtrolPublished 5 min read

Qu'est-ce qu'ImGui ?

ImGui, abréviation de Dear ImGui, est une petite bibliothèque d'interface graphique immédiate (GUI) pour C++. Elle dessine un menu à partir de zéro à chaque image, à partir d'appels de fonctions simples, au lieu de conserver un arbre d'objets de widgets. Cela permet de la configurer rapidement et de l'intégrer facilement au-dessus de la boucle de rendu existante d'un jeu, ce qui explique pourquoi les outils et les clients natifs l'utilisent pour les superpositions à faible latence.

L'idée clé est le mode « immédiat » : au lieu de créer un objet Bouton et de le stocker, vous appelez une fonction qui dit « dessiner un bouton ici », et cet appel dessine à la fois le bouton et vous indique s'il a été cliqué cette image.

Ce que signifie le mode immédiat

ImGui reconstruit l'interface à chaque image. Vous ne créez pas d'objet bouton et vous ne le stockez pas. Vous appelez une fonction qui dit « dessiner un bouton ici », et cet appel dessine à la fois le bouton et vous indique s'il a été cliqué cette image.

Une boîte à outils en mode conservé fonctionne à l'inverse. Elle conserve un arbre de widgets de longue durée en mémoire, et vous mettez à jour cet arbre lorsque l'état change. Le mode immédiat sacrifie cette structure persistante pour un code qui se lit de haut en bas et qui vit à côté de votre propre état.

  1. L'application exécute la boucle d'images

    Le jeu affiche une trame et appelle le code de l'interface utilisateur dans le cadre de cette opération.

  2. Le code d'interface utilisateur s'exécute

    Vous appelez les fonctions d'ImGui pour construire le menu de haut en bas : boutons, curseurs, cases à cocher.

  3. ImGui dessine et réagit

    Les fonctions rendent à la fois les widgets et renvoient un booléen indiquant si une interaction a eu lieu avec ce cadre.

  4. Votre code réagit

    Vous lisez les valeurs de retour et mettez à jour votre propre état, comme si vous appeliez do_thing() lorsque le bouton a été cliqué cette trame.

Pourquoi les outils et les clients l'adoptent

ImGui est populaire pour les menus qui se superposent à une scène 3D. Les raisons sont pratiques :

  • Faible latence : il se branche sur un frame que le programme rend déjà, donc le menu réagit immédiatement.
  • Peu de code d’intégration : une fenêtre et quelques contrôles ne nécessitent qu’un nombre limité d’appels de fonctions. Il n’y a pas de fichier de mise en page ni de thread d’interface utilisateur séparé à gérer.
  • Autonome : la bibliothèque a peu de dépendances et s’intègre aux backends graphiques courants, sans pour autant intégrer un framework lourd.
  • Facile à déboguer : les mêmes appels qui construisent un menu en version finale construisent également les panneaux temporaires que les développeurs utilisent lors de la création d’une fonctionnalité

Mode immédiat vs. mode conservé

AspectMode immédiat (ImGui)Jeu de composants conservés
Gestion de l'étatVotre code détient les donnéesLe jeu de composants détient un arbre de widgets
Travail par imageReconstruire l'interface utilisateur à chaque imageMettre à jour l'arbre en cas de changement
Coût de configurationQuelques appels de fonctionPlus de structure au départ
Adaptation idéaleSuperpositions, outils, menus de jeuApplications de type document volumineux

Le mode immédiat est idéal pour quelque chose qui doit se mettre à jour à chaque image et répondre instantanément aux entrées. Le mode conservé est préférable pour quelque chose qui reste principalement statique et qui change rarement

Comment cela convient à un client natif

Un client utilitaire natif, développé en C++, dessine souvent son menu avec ImGui au-dessus du frame du jeu. Le code du menu s'exécute à l'intérieur de la boucle de rendu, lit les paramètres propres au client et écrit les modifications directement en retour. Il n'y a pas de processus d'interface utilisateur distinct, donc l'activation d'une fonctionnalité équivaut à un appel de fonction contre une valeur que le client possède déjà.

C'est un schéma en C++. Un mod Fabric écrit en Java accède à son interface par le biais des propres hooks GUI du jeu, de sorte qu'ImGui apparaît principalement dans les clients qui sont livrés en tant que code natif plutôt qu'en tant que mods Java.

FAQ