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.
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.
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.
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.
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.
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é
| Aspect | Mode immédiat (ImGui) | Jeu de composants conservés |
|---|---|---|
| Gestion de l'état | Votre code détient les données | Le jeu de composants détient un arbre de widgets |
| Travail par image | Reconstruire l'interface utilisateur à chaque image | Mettre à jour l'arbre en cas de changement |
| Coût de configuration | Quelques appels de fonction | Plus de structure au départ |
| Adaptation idéale | Superpositions, outils, menus de jeu | Applications 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
La bibliothèque de base est en C++, et c'est là que la plupart des projets l'utilisent. Des liaisons communautaires existent pour d'autres langages, mais l'utilisation originale et la plus courante se fait en C++ pour les outils de jeux.
À l'état initial, il présente un aspect simple d'outil de développement. Les projets qui souhaitent un thème de style personnalisé le personnalisent fortement ou dessinent leurs propres widgets par-dessus.
Pas de la manière habituelle. Un mod Fabric s'exécute en Java et utilise le système d'interface graphique du jeu. Un client natif en C++ est le foyer typique d'ImGui.
Non. Reconstruire l'interface utilisateur est peu coûteux, et le programme rend déjà chaque image, donc le menu est intégré au travail qui est déjà en cours.