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.
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.
L'applicazione esegue il ciclo di rendering
Il gioco genera un frame e chiama il codice dell'interfaccia utente come parte di esso.
Il codice UI viene eseguito
Chiami le funzioni di ImGui per costruire il menu dall'alto verso il basso: pulsanti, slider, caselle di controllo.
ImGui disegna e risponde
Le funzioni rendono sia i widget che restituiscono se sono stati interagiti in questo frame.
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
| Aspetto | Modalità Immediata (ImGui) | Toolkit a modalità ritenzione |
|---|---|---|
| Proprietà dello stato | Il tuo codice gestisce i dati | Il toolkit gestisce un albero di widget |
| Lavoro per frame | Ricostruisci l'interfaccia utente ogni frame | Aggiorna l'albero in caso di modifica |
| Costo di configurazione | Alcune chiamate di funzione | Più struttura iniziale |
| Adatto a | Overlay, strumenti, menu di gioco | App 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
La libreria principale è in C++, ed è lì che la maggior parte dei progetti la utilizza. Esistono binding di comunità per altri linguaggi, ma l'uso originale e più comune è negli strumenti di gioco in C++.
All'inizio, presenta un aspetto semplice da strumento di sviluppo. I progetti che desiderano un tema di stile personalizzato lo utilizzano ampiamente o disegnano i propri widget sopra di esso.
Non nel modo solito. Un mod Fabric gira in Java e utilizza il sistema GUI del gioco. Un client nativo in C++ è la sede tipica per ImGui.
No. Ricostruire l'interfaccia utente è economico, e il programma già genera ogni fotogramma, quindi il menu si integra nel lavoro che viene già svolto.