Programação de GUI em Modo Imediato
Frameworks de GUI em modo imediato, como Dear ImGui e egui, prometem código de UI mais simples e linear ao redesenhar a interface a cada frame e evitar a instalação explícita de manipuladores de eventos. Os comentaristas contrastam isso com toolkits tradicionais de modo retido (Qt, widgets nativos do SO, layouts web/CSS), argumentando que, embora o modo imediato seja excelente para ferramentas dentro do engine, UIs de depuração e alguns apps desktop, ele enfrenta dificuldades com layouts complexos, integração com a plataforma, acessibilidade e uso de energia, a menos que sistemas extras de estado e layout sejam efetivamente reconstruídos. Vários observam que sistemas “declarativos” modernos como React ficam em algum ponto intermediário, e que, na prática, a escolha certa depende menos da pureza do paradigma e mais da maturidade das ferramentas, das necessidades de desempenho e de quanta complexidade e polimento da UI os usuários finais esperam.
Visão geral: GUIs de modo imediato vs. modo retido
- Modo imediato: a UI é descrita a cada frame em código linear (por exemplo,
if Button(...) { ... }). Não há objetos explícitos de widgets nem manipuladores de eventos instalados no código do usuário; o estado muitas vezes fica oculto dentro do framework. - Modo retido: a UI é uma árvore de widgets/objetos com seu próprio estado e callbacks; o toolkit “possui” o loop de eventos e redesenha conforme necessário.
- Vários comentaristas enfatizam que a distinção diz respeito principalmente à API pública, e não a se o estado é retido internamente.
Loop de eventos, fluxo de controle e depuração
- Defensores gostam de ter um único loop principal e um fluxo de controle linear, mais fácil de depurar, em vez de callbacks espalhados.
- Críticos argumentam que você nunca realmente “se livra” do loop de eventos; o SO ainda conduz os eventos, e a maioria dos backends IMGUI espera um padrão tradicional de loop de eventos.
- Alguns veem a simplificação do fluxo de controle como algo que acelera o desenvolvimento, especialmente para desenvolvedores que não gostam de programação tradicional de UI.
Desempenho, bateria e redesenho
- Céticos: redesenho constante da tela inteira e layout por frame podem desperdiçar CPU e bateria, especialmente em laptops e dispositivos móveis. Foram dados exemplos de ferramentas IMGUI consumindo CPU perceptível em repouso.
- Outros contra-argumentam que:
- Você pode bloquear em eventos e repintar apenas quando houver interação.
- Frameworks IMGUI podem rastrear “retângulos interativos”, regiões sujas e cachear estado.
- Algumas bibliotecas já repintam apenas quando há mudanças, embora existam issues e PRs abertos sobre “modos de economia de energia”.
- Permanece a discordância sobre se essas otimizações são inerentes ou apenas complexidade extra empurrada para o autor da aplicação/framework.
UIs complexas, layout e estado
- Experiências pró-IMGUI vindas de ferramentas de desenvolvimento de jogos: editores complexos, inspetores, perfis e UIs de depuração foram construídos com sucesso, beneficiando-se da integração estreita com a lógica do engine.
- Críticos relatam dor ao sair de “depuradores improvisados” para ferramentas completas: as pessoas passam a emular modo retido, mantendo muito estado e lógica de layout manualmente, o que leva a código bagunçado.
- Layout é um grande ponto de tensão:
- Modo imediato é visto como ótimo para layouts simples e posicionamento manual.
- Restrições responsivas e de múltiplas passagens (por exemplo, quebra de texto, centralização de vários widgets, redimensionamento dinâmico) são mais difíceis; algumas bibliotecas (por exemplo, certos IMGUIs em Rust) têm limitações notáveis.
- Outros descrevem algoritmos de layout de múltiplas passagens funcionando bem em IMGUI; o desafio é o desempenho e a necessidade de refazer o layout a cada frame.
Casos de uso e adequação
- Forte encaixe:
- Ferramentas dentro do engine, overlays de depuração, editores de jogos, ferramentas internas simples, apps com muito gráfico em que já existe um loop de renderização.
- Menor adequação / ceticismo:
- Aplicativos desktop para usuários finais, onde se espera aparência nativa, baixo uso de CPU em repouso e forte integração com a plataforma.
- Aplicativos móveis, onde energia, desempenho, convenções da plataforma e acessibilidade são críticos; vários recomendam usar toolkits nativos ou apoiados por nativo em vez disso.
Relação com UIs web/estilo React
- Alguns veem React, Flutter, SwiftUI, Streamlit etc. como “semelhantes ao modo imediato” porque as UIs são redeclaradas a cada renderização; o VDOM do React é descrito como “imediato por cima de retido”.
- Outros observam diferenças no fluxo de eventos e no gerenciamento de estado, mas em geral concordam que há sobreposição conceitual.
Acessibilidade, completude e reinvenção
- Críticos enfatizam que apps sérios precisam de localização, acessibilidade e widgets ricos; reconstruir tudo isso em IMGUI é um esforço grande e corre o risco de repetir erros já resolvidos em toolkits maduros.
- Existem exemplos de frameworks IMGUI integrando camadas de acessibilidade, mostrando que é possível, mas não comum.
- Vários concluem que ambos os paradigmas são ferramentas; a principal vantagem do IMGUI é a produtividade do desenvolvedor para certas classes de apps, não uma substituição universal para GUIs retidas.