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.

TRtrolPublished 4 min read

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.

  1. Aplikacja wykonuje pętlę animacji

    Gra renderuje klatkę i wywołuje kod UI jako jej część.

  2. Kod UI działa

    Wywołujesz funkcje ImGui, aby zbudować menu od góry do dołu: przyciski, suwaki, pola wyboru.

  3. ImGui rysuje i odpowiada

    Funkcje te renderują widżety i zwracają informację, czy zostały użyte w tym oknie.

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

AspektTryb natychmiastowy (ImGui)Toolkit w trybie zachowywania
Własność stanuTwój kod przechowuje daneToolkit przechowuje drzewo widżetów
Praca na klatkęPrzebuduj interfejs użytkownika każdej klatkiZaktualizuj drzewo w przypadku zmiany
Koszt konfiguracjiKilka wywołań funkcjiWięcej struktury na początku
Najlepsze dopasowanieNakładki, narzędzia, menu gierDuż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