Learn · concepts
Czym jest ImGui? Wyjaśnienie Dear ImGui
ImGui (Dear ImGui) to biblioteka GUI działająca w trybie natychmiastowym dla C++. Rysuje menu w każdej klatce bez przechowywanej struktury widżetów, co jest powszechne w narzędziach do gier i natywnych klientach.
Czym jest ImGui?
ImGui, czyli Dear ImGui, to mała biblioteka GUI opartej na natychmiastowym trybie dla C++. Rysuje menu od nowa w każdej klatce bezpośrednio z wywołań funkcji, zamiast utrzymywać drzewo obiektów widgetów. Dzięki temu jest szybko konfigurowana i łatwo można ją dodać do istniejącej pętli renderowania gry, co jest powodem, dla którego narzędzia i natywne klienty używają jej do nakładek o niskiej latencji.
Kluczowym założeniem jest „natychmiastowy tryb”: zamiast tworzyć obiekt przycisku i go przechowywać, wywołujesz funkcję, która mówi „narysuj przycisk tutaj”, a to wywołanie zarówno rysuje przycisk, jak i informuje, czy został kliknięty w bieżącej klatce.
Czym oznacza natychmiastowy tryb
ImGui odtwarza interfejs w każdej klatce. Nie tworzysz obiektu przycisku i go przechowujesz. Wywołujesz funkcję, która mówi „narysuj przycisk tutaj”, a to wywołanie zarówno rysuje przycisk, jak i informuje, czy został kliknięty w bieżącej klatce.
Toolkit działający w trybie zatrzymanym działa w przeciwnym kierunku. Przechowuje długotrwałe drzewo widgetów w pamięci i aktualizujesz je, gdy zmienia się stan. Natychmiastowy tryb wymienia tę trwałą strukturę na kod, który czytany jest od góry do dołu i znajduje się obok własnego stanu.
Aplikacja wykonuje pętlę animacji
Gra renderuje klatkę i wywołuje kod UI jako jej część.
Kod UI działa
Wywołujesz funkcje ImGui, aby zbudować menu od góry do dołu: przyciski, suwaki, pola wyboru.
ImGui rysuje i odpowiada
Funkcje te renderują widżety i zwracają informację, czy zostały użyte w tym oknie.
Twój kod reaguje
Czytasz zwracane wartości i aktualizujesz swój stan, podobnie jak wywołujesz
do_thing()po kliknięciu przycisku w bieżącej klatce.
Dlaczego narzędzia i klienci to wybierają
ImGui jest popularne do menu nakładanych na scenę 3D. Powody są praktyczne:
- Niska latencja: podłącza się do klatki, którą program już renderuje, dzięki czemu menu reaguje natychmiast.
- Mało kleju: okno i kilka kontrolek to garść wywołań funkcji. Nie ma pliku układu ani oddzielnego wątku interfejsu użytkownika do zarządzania.
- Samodzielne: biblioteka ma niewiele zależności i pasuje do popularnych backendów graficznych, więc nie wciąga ciężkiego frameworka.
- Przyjazne dla debugowania: te same wywołania, które budują menu w wersji produkcyjnej, budują również tymczasowe panele debugowania, których programiści używają podczas tworzenia funkcji.
Tryb natychmiastowy vs tryb zachowywania
| Aspekt | Tryb natychmiastowy (ImGui) | Toolkit w trybie zachowywania |
|---|---|---|
| Własność stanu | Twój kod przechowuje dane | Toolkit przechowuje drzewo widżetów |
| Praca na klatkę | Przebuduj interfejs użytkownika każdej klatki | Zaktualizuj drzewo w przypadku zmiany |
| Koszt konfiguracji | Kilka wywołań funkcji | Więcej struktury na początku |
| Najlepsze dopasowanie | Nakładki, narzędzia, menu gier | Duże aplikacje w stylu dokumentów |
Tryb natychmiastowy jest idealny do czegoś, co musi być aktualizowane każdej klatki i reagować na dane wejściowe natychmiast. Tryb zachowywania jest lepszy do czegoś, co jest w większości statyczne i rzadko się zmienia.
Jak pasuje do natywnego klienta
Natywny klient narzędziowy napisany w C++ często rysuje swoje menu za pomocą ImGui na wierzchu klatki gry. Kod menu działa wewnątrz pętli renderowania, odczytuje własne ustawienia klienta i zapisuje zmiany bezpośrednio z powrotem. Nie ma oddzielnego procesu interfejsu użytkownika, więc przełączanie funkcji to jedno wywołanie funkcji skierowane do wartości, którą klient już posiada.
Jest to wzorzec C++. Mod Fabric napisany w Javie dociera do swojego interfejsu przez własne mechanizmy GUI gry, więc ImGui pojawia się głównie w klientach, które są dostarczane jako kod natywny, a nie jako mody Java.
FAQ
Rdzeniem biblioteki jest C++, i to w niej większość projektów z niej korzysta. Istnieją biblioteki dla innych języków, ale oryginalne i najczęstsze zastosowanie ma ona w narzędziach do gier napisanych w C++.
Z pudełka ma wygląd typowy dla narzędzi developerskich. Projekty, które chcą własnego motywu wizualnego, wykorzystują go intensywnie lub rysują własne widżety na jego podstawie.
Nie w zwykły sposób. Mod Fabric działa w Javie i wykorzystuje system GUI gry. Klient natywny w C++ to typowe środowisko dla ImGui.
Nie. Rekonstrukcja interfejsu użytkownika jest tania, a program i tak renderuje każdą klatkę, więc menu pojawia się przy okazji pracy, która i tak jest wykonywana.