Learn · concepts
O que é ImGui? ImGui Explicado
ImGui (Dear ImGui) é uma biblioteca de interface gráfica imediata para C++. Ela desenha menus a cada frame sem uma árvore de widgets retida, comum em ferramentas de jogos e clientes nativos.
O que é ImGui?
ImGui, abreviação de Dear ImGui, é uma pequena biblioteca de GUI de modo imediato para C++. Ela desenha um menu novo a cada frame a partir de chamadas de função simples, em vez de manter uma árvore de objetos de widget. Isso a torna rápida de configurar e fácil de adicionar em cima do loop de renderização existente de um jogo, o que é o motivo pelo qual ferramentas e clientes nativos a utilizam para sobreposições de baixa latência.
A principal ideia é o "modo imediato": em vez de criar um objeto Button e armazená-lo, você chama uma função que diz "desenhe um botão aqui", e essa chamada tanto desenha o botão quanto informa se ele foi clicado neste frame.
O que modo imediato significa
ImGui reconstrói a interface a cada frame. Você não cria um objeto de botão e o armazena. Você chama uma função que diz "desenhe um botão aqui", e essa chamada tanto desenha o botão quanto informa se ele foi clicado neste frame.
Um toolkit de modo retido funciona de forma oposta. Ele mantém uma árvore de widgets de longa duração na memória, e você atualiza essa árvore quando o estado muda. O modo imediato troca essa estrutura persistente por código que lê de cima para baixo e vive ao lado do seu próprio estado.
A aplicação executa o loop de frame
O jogo renderiza um quadro e chama o código da interface do usuário como parte dele.
O código da interface do usuário é executado
Você chama as funções do ImGui para construir o menu de cima para baixo: botões, sliders, checkboxes.
ImGui desenha e responde
As funções renderizam os widgets e retornam se foram interagidos neste frame.
O seu código reage
Você lê os valores de retorno e atualiza seu próprio estado, como chamar
do_thing()quando o botão foi clicado neste frame.
Por que ferramentas e clientes o escolhem
ImGui é popular para menus que se sobrepõem a uma cena 3D. As razões são práticas:
- Baixa latência: ele se conecta a um frame que o programa já renderiza, então o menu reage imediatamente.
- Pouco código de integração: uma janela e alguns controles são apenas algumas chamadas de função. Não há arquivo de layout e nenhum thread de UI separado para gerenciar.
- Autocontido: a biblioteca tem poucas dependências e se encaixa em backends gráficos comuns, então não importa um framework pesado.
- Amigável para depuração: as mesmas chamadas que constroem um menu de lançamento também constroem os painéis descartáveis de depuração que os desenvolvedores usam ao construir uma funcionalidade
Modo imediato vs. modo retido
| Aspecto | Modo Imediato (ImGui) | Toolkit de modo Retido |
|---|---|---|
| Propriedade do estado | Seu código mantém os dados | O toolkit mantém uma árvore de widgets |
| Trabalho por frame | Reconstrua a UI a cada frame | Atualize a árvore em caso de mudança |
| Custo de configuração | Algumas chamadas de função | Mais estrutura inicialmente |
| Melhor para | Sobreposições, ferramentas, menus de jogos | Aplicativos do estilo de documentos grandes |
O modo imediato é ideal para algo que precisa atualizar a cada frame e responder à entrada instantaneamente. O modo retido é melhor para algo que permanece estático na maior parte do tempo e muda raramente
Como se encaixa para um cliente nativo
Um cliente utilitário nativo, construído em C++, frequentemente desenha seu menu com ImGui sobre o frame do jogo. O código do menu é executado dentro do loop de renderização, lê as configurações do próprio cliente e escreve as alterações diretamente de volta. Não há um processo de UI separado, então alternar um recurso é apenas uma chamada de função contra um valor que o cliente já possui.
Este é um padrão em C++. Um mod Fabric escrito em Java alcança sua interface através dos próprios hooks de GUI do jogo, então o ImGui geralmente aparece em clientes que são enviados como código nativo, e não como mods Java.
Perguntas Frequentes
A biblioteca principal é C++, e é lá que a maioria dos projetos a utilizam. Existem ligações da comunidade para outras linguagens, mas o uso original e mais comum é em ferramentas de jogos em C++.
De fábrica, apresenta um visual simples de ferramenta de desenvolvimento. Projetos que desejam um tema de estilo personalizado o utilizam intensamente ou desenham seus próprios widgets por cima.
Não da maneira usual. Um mod Fabric roda em Java e utiliza o sistema de GUI do jogo. Um cliente nativo em C++ é o lar típico do ImGui.
Não. Reconstruir a IU é barato, e o programa já renderiza cada frame, então o menu acompanha o trabalho que já está sendo feito.