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.

TRtrolPublished 4 min read

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.

  1. Die Anwendung führt eine Frame-Schleife aus

    Das Spiel rendert einen Frame und ruft den UI-Code als Teil davon auf.

  2. Die UI-Code läuft

    Sie rufen ImGui-Funktionen auf, um das Menü von oben nach unten zu erstellen: Schaltflächen, Schieberegler, Kontrollkästchen.

  3. ImGui zeichnet und reagiert

    Die Funktionen rendern sowohl die Widgets als auch zurückgeben, ob sie mit diesem Frame interagiert wurden.

  4. 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

AspektImmediate-Mode (ImGui)Retained-Mode Toolkit
ZustandsverwaltungIhr Code verwaltet die DatenDas Toolkit verwaltet einen Widget-Baum
Arbeit pro FrameDie Benutzeroberfläche wird jeden Frame neu aufgebautDer Baum wird bei Änderungen aktualisiert
EinrichtungskostenEin paar FunktionsaufrufeMehr Struktur im Voraus
Am besten geeignet fürOverlays, Tools, SpielmenüsGroß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