Learn · concepts
Was ist ImGui? Dear ImGui erklärt
ImGui (Dear ImGui) ist eine Immediate-Mode-GUI-Bibliothek für C++. Es zeichnet Menüs jeden Frame ohne gespeicherten Widget-Baum, was in Game-Tools und nativen Clients üblich ist.
Was ist ImGui?
ImGui, kurz für Dear ImGui, ist eine kleine Immediate-Mode-GUI-Bibliothek für C++. Sie zeichnet ein Menü jeden Frame neu aus einfachen Funktionsaufrufen, anstatt einen Baum von Widget-Objekten zu verwalten. Das macht die Integration schnell und einfach und ermöglicht es, sie problemlos über die bestehende Render-Schleife eines Spiels zu legen, was auch der Grund dafür ist, dass Tools und native Clients sie für Overlay-Anwendungen mit geringer Latenz verwenden.
Die Schlüsselidee ist das „Immediate-Mode“-Prinzip: Anstatt ein Button-Objekt zu erstellen und zu speichern, rufst du eine Funktion auf, die „zeichne hier einen Button“ sagt, und dieser Aufruf zeichnet sowohl den Button als auch teilt dir mit, ob er in diesem Frame angeklickt wurde.
Was Immediate-Mode bedeutet
ImGui baut die Benutzeroberfläche jeden Frame neu auf. Du erstellst kein Button-Objekt und speicherst es. Du rufst eine Funktion auf, die „zeichne hier einen Button“ sagt, und dieser Aufruf zeichnet sowohl den Button als auch teilt dir mit, ob er in diesem Frame angeklickt wurde.
Ein Retained-Mode-Toolkit funktioniert umgekehrt. Es verwaltet einen langlebigen Widget-Baum im Speicher und aktualisiert diesen, wenn sich der Zustand ändert. Immediate-Mode tauscht diese persistente Struktur gegen Code, der von oben nach unten gelesen wird und sich in der Nähe deines eigenen Zustands befindet.
Die Anwendung führt eine Frame-Schleife aus
Das Spiel rendert einen Frame und ruft den UI-Code als Teil davon auf.
Die UI-Code läuft
Sie rufen ImGui-Funktionen auf, um das Menü von oben nach unten zu erstellen: Schaltflächen, Schieberegler, Kontrollkästchen.
ImGui zeichnet und reagiert
Die Funktionen rendern sowohl die Widgets als auch zurückgeben, ob sie mit diesem Frame interagiert wurden.
Dein Code reagiert
Du liest die Rückgabewerte und aktualisierst deinen eigenen Zustand, ähnlich wie beim Aufruf von
do_thing(), wenn der Button in diesem Frame angeklickt wurde.
Warum Tools und Clients es wählen
ImGui ist beliebt für Menüs, die über eine 3D-Szene gelegt werden. Die Gründe sind praktisch:
- Geringe Latenz: Es hängt sich in einen Frame ein, den das Programm bereits rendert, sodass das Menü sofort reagiert.
- Weniger Bindung: Ein Fenster und ein paar Steuerelemente sind nur eine Handvoll Funktionsaufrufe. Es gibt keine Layout-Datei und keinen separaten UI-Thread, der verwaltet werden muss.
- Autonom: Die Bibliothek hat wenige Abhängigkeiten und passt sich in gängige Grafik-Backends ein, sodass sie kein schweres Framework benötigt.
- Debug-freundlich: Die gleichen Aufrufe, die ein Release-Menü erstellen, erstellen auch die temporären Debug-Panels, die Entwickler beim Erstellen einer Funktion verwenden.
Immediate-Mode vs. Retained-Mode
| Aspekt | Immediate-Mode (ImGui) | Retained-Mode Toolkit |
|---|---|---|
| Zustandsverwaltung | Ihr Code verwaltet die Daten | Das Toolkit verwaltet einen Widget-Baum |
| Arbeit pro Frame | Die Benutzeroberfläche wird jeden Frame neu aufgebaut | Der Baum wird bei Änderungen aktualisiert |
| Einrichtungskosten | Ein paar Funktionsaufrufe | Mehr Struktur im Voraus |
| Am besten geeignet für | Overlays, Tools, Spielmenüs | Große, dokumentenähnliche Anwendungen |
Immediate-Mode ist ideal für etwas, das jeden Frame aktualisiert und sofort auf Eingaben reagieren muss. Retained-Mode ist besser für etwas, das meist statisch ist und selten Änderungen vornimmt.
Wie es in einen nativen Client passt
Ein nativ erstellter Utility-Client, der in C++ geschrieben ist, zeichnet sein Menü oft mit ImGui über das Spiel-Frame. Der Menücode läuft innerhalb der Render-Schleife, liest die eigenen Einstellungen des Clients und schreibt Änderungen direkt zurück. Es gibt keinen separaten UI-Prozess, sodass das Umschalten einer Funktion einen einzigen Funktionsaufruf gegen einen Wert darstellt, den der Client bereits besitzt.
Dies ist ein C++-Muster. Ein Fabric-Mod, das in Java geschrieben ist, erreicht seine Schnittstelle über die eigenen GUI-Hooks des Spiels, sodass ImGui hauptsächlich in Clients auftaucht, die als nativ kompilierten Code und nicht als Java-Mods ausgeliefert werden.
Häufig gestellte Fragen
Die Kernbibliothek ist C++, und die meisten Projekte nutzen sie dort. Community-Bindings existieren zwar für andere Sprachen, aber die ursprüngliche und häufigste Verwendung findet sich in C++-Game-Tools.
Aus der Box heraus hat es ein schlichtes Aussehen wie ein Entwicklertool. Projekte, die ein benutzerdefiniertes Style-Theme wünschen oder eigene Widgets darüber aufbauen, nutzen es stark.
Nicht auf die übliche Weise. Ein Fabric-Mod läuft in Java und nutzt das GUI-System des Spiels. Ein nativer C++-Client ist die typische Umgebung für ImGui.
Nein. Die Neuerstellung der Benutzeroberfläche ist günstig, und das Programm rendert bereits jeden Frame, sodass sich das Menü mit der ohnehin laufenden Arbeit mitreißt.