Learn · concepts

Cos'è ImGui? ImGui Spiegato

ImGui (Dear ImGui) è una libreria GUI a modalità immediata per C++. Disegna i menu ogni frame senza un albero di widget persistente, cosa comune negli strumenti di gioco e nei client nativi.

TRtrolPublished 5 min read

Cos'è ImGui?

ImGui, acronimo di Dear ImGui, è una piccola libreria GUI immediate-mode per C++. Disegna un menu fresco ogni frame a partire da semplici chiamate di funzione, invece di mantenere un albero di oggetti widget. Questo la rende veloce da integrare e facile da sovrapporre al ciclo di rendering esistente di un gioco, motivo per cui gli strumenti e le applicazioni native la utilizzano per overlay a bassa latenza.

L'intuizione chiave è la "immediate-mode": invece di creare un oggetto Button e memorizzarlo, si chiama una funzione che dice "disegna un pulsante qui", e questa chiamata disegna sia il pulsante che indica se è stato cliccato in questo frame.

Cosa significa immediate-mode

ImGui ricostruisce l'interfaccia ad ogni frame. Non si crea un oggetto pulsante e lo si memorizza. Si chiama una funzione che dice "disegna un pulsante qui", e questa chiamata disegna sia il pulsante che indica se è stato cliccato in questo frame.

Un toolkit a retained-mode funziona in modo opposto. Mantiene un albero di widget di lunga durata in memoria, e lo si aggiorna quando lo stato cambia. La immediate-mode sacrifica questa struttura persistente per un codice che si legge dall'alto verso il basso e che vive accanto al proprio stato.

  1. L'applicazione esegue il ciclo di rendering

    Il gioco genera un frame e chiama il codice dell'interfaccia utente come parte di esso.

  2. Il codice UI viene eseguito

    Chiami le funzioni di ImGui per costruire il menu dall'alto verso il basso: pulsanti, slider, caselle di controllo.

  3. ImGui disegna e risponde

    Le funzioni rendono sia i widget che restituiscono se sono stati interagiti in questo frame.

  4. Il tuo codice reagisce

    Leggi i valori di ritorno e aggiorna il tuo stato, come chiamare do_thing() quando il pulsante è stato cliccato in questo frame.

Per quale motivo strumenti e clienti lo scelgono

ImGui è popolare per i menu che si sovrappongono a una scena 3D. Le ragioni sono pratiche:

  • Bassa latenza: si integra in un frame che il programma sta già renderizzando, quindi il menu reagisce immediatamente.
  • Pochi accorgimenti: una finestra e pochi controlli richiedono solo un numero limitato di chiamate di funzione. Non c'è un file di layout e non è necessario gestire un thread UI separato.
  • Autonomo: la libreria ha poche dipendenze e si integra con i backend grafici più comuni, quindi non richiede un framework pesante.
  • Facile da debuggare: le stesse chiamate che creano un menu in versione release creano anche i pannelli di debug temporanei che gli sviluppatori utilizzano durante la creazione di una funzionalità

Modalità immediata vs. modalità ritardata

AspettoModalità Immediata (ImGui)Toolkit a modalità ritenzione
Proprietà dello statoIl tuo codice gestisce i datiIl toolkit gestisce un albero di widget
Lavoro per frameRicostruisci l'interfaccia utente ogni frameAggiorna l'albero in caso di modifica
Costo di configurazioneAlcune chiamate di funzionePiù struttura iniziale
Adatto aOverlay, strumenti, menu di giocoApp di tipo documento di grandi dimensioni

La modalità immediata è ideale per qualcosa che necessita di aggiornarsi ogni frame e rispondere all'input istantaneamente. La modalità ritenzione è migliore per qualcosa che rimane perlopiù statico e cambia raramente

Come si adatta a un cliente madrelingua

Un client utility nativo, sviluppato in C++, spesso disegna il suo menu con ImGui sopra il frame del gioco. Il codice del menu viene eseguito all'interno del ciclo di rendering, legge le impostazioni del client stesso e scrive le modifiche direttamente. Non c'è un processo UI separato, quindi l'attivazione di una funzionalità è una singola chiamata di funzione su un valore che il client possiede già.

Questo è un pattern in C++. Un mod Fabric scritto in Java raggiunge la sua interfaccia attraverso i propri hook GUI del gioco, quindi ImGui compare principalmente nei client che vengono forniti come codice nativo piuttosto che come mod Java.

DOMANDE FREQUENTI