Programación de GUI en modo inmediato

Los frameworks de GUI en modo inmediato, como Dear ImGui y egui, prometen código de UI más simple y lineal al redibujar la interfaz en cada frame y evitar el cableado explícito de manejadores de eventos. Los comentaristas lo contrastan con los toolkits tradicionales de modo retenido (Qt, widgets nativos del sistema operativo, layouts web/CSS), argumentando que, aunque el modo inmediato destaca para herramientas dentro del motor, UIs de depuración y algunas apps de escritorio, tiene dificultades con layouts complejos, integración con la plataforma, accesibilidad y uso de energía, salvo que se reconstruyan eficazmente sistemas extra de estado y layout. Varios señalan que los sistemas “declarativos” modernos como React se sitúan en un punto intermedio, y que en la práctica la elección correcta depende menos de la pureza del paradigma y más de la madurez de las herramientas, las necesidades de rendimiento y cuánta complejidad y pulido de UI esperan los usuarios finales.

A alto nivel: GUIs de modo inmediato frente a modo retenido

  • Modo inmediato: la UI se describe en cada frame en código lineal (por ejemplo, if Button(...) { ... }). No hay objetos de widgets explícitos ni controladores de eventos instalados en el código del usuario; el estado suele estar oculto dentro del framework.
  • Modo retenido: la UI es un árbol de widgets/objetos con su propio estado y callbacks; el toolkit “posee” el bucle de eventos y vuelve a dibujar según sea necesario.
  • Varios comentaristas subrayan que la distinción se refiere sobre todo a la API pública, no a si el estado se conserva internamente.

Bucle de eventos, flujo de control y depuración

  • A quienes lo apoyan les gusta tener un único bucle principal y un flujo de control lineal y fácil de depurar, en lugar de callbacks dispersos.
  • Quienes lo critican sostienen que nunca realmente “eliminas” el bucle de eventos; el sistema operativo sigue impulsando los eventos, y la mayoría de los backends IMGUI esperan un patrón tradicional de bucle de eventos.
  • Algunos ven que la simplificación del flujo de control permite desarrollar más rápido, especialmente para desarrolladores a quienes no les gusta la programación tradicional de UI.

Rendimiento, batería y redibujado

  • Escépticos: el redibujado completo constante y el layout por frame pueden desperdiciar CPU y batería, especialmente en portátiles y móviles. Se dieron ejemplos de herramientas IMGUI que consumen una CPU notable en reposo.
  • Otros responden que:
    • Puedes bloquearte esperando eventos y redibujar solo ante interacción.
    • Los frameworks IMGUI pueden rastrear “rectángulos interactivos”, regiones sucias y cachear estado.
    • Algunas bibliotecas ya redibujan solo ante cambios, aunque hay incidencias abiertas y PRs sobre “modos de ahorro de energía”.
  • Sigue habiendo desacuerdo sobre si estas optimizaciones son inherentes o simplemente complejidad extra trasladada al autor de la app/framework.

UI complejas, layout y estado

  • Experiencias pro-IMGUI desde herramientas para desarrollo de juegos: se han construido con éxito editores complejos, inspectores, perfiles y UIs de depuración, beneficiándose de una estrecha integración con la lógica del motor.
  • Quienes critican informan de problemas al pasar de “depuradores chapuceros” a herramientas completas: la gente empieza a emular el modo retenido, manteniendo mucho estado y lógica de layout manualmente, lo que conduce a código desordenado.
  • El layout es un gran punto de fricción:
    • El modo inmediato se considera estupendo para layouts simples y posicionamiento manual.
    • Las restricciones responsivas de varias pasadas (por ejemplo, ajustar texto, centrar varios widgets, redimensionamiento dinámico) son más difíciles; algunas bibliotecas (por ejemplo, ciertos IMGUI de Rust) tienen limitaciones notables.
    • Otros describen algoritmos de layout de varias pasadas que funcionan bien en IMGUI; el reto es el rendimiento y la necesidad de volver a ejecutar el layout en cada frame.

Casos de uso y adecuación

  • Buen encaje:
    • Herramientas dentro del motor, overlays de depuración, editores de juegos, herramientas internas simples, apps con mucha gráfica donde ya existe un bucle de renderizado.
  • Encaje más débil / escepticismo:
    • Apps de escritorio para usuario final donde se espera aspecto nativo, poco consumo en reposo y fuerte integración con la plataforma.
    • Apps móviles, donde la energía, el rendimiento, las convenciones de plataforma y la accesibilidad son críticas; varios recomiendan usar en su lugar toolkits nativos o respaldados por nativo.

Relación con la web y UIs estilo React

  • Algunos ven React, Flutter, SwiftUI, Streamlit, etc. como “parecidos al modo inmediato” porque las UIs se vuelven a declarar en cada render; la VDOM de React se describe como “inmediato sobre retenido”.
  • Otros señalan diferencias en el flujo de eventos y la gestión del estado, pero en general están de acuerdo en que hay solapamiento conceptual.

Accesibilidad, completitud y reinvención

  • Quienes critican enfatizan que las apps serias necesitan localización, accesibilidad y widgets ricos; reconstruir todo esto sobre IMGUI supone un gran esfuerzo y arriesga repetir errores ya resueltos en toolkits maduros.
  • Existen ejemplos de frameworks IMGUI que integran capas de accesibilidad, mostrando que es posible aunque no común.
  • Varios concluyen que ambos paradigmas son herramientas; la principal ventaja de IMGUI es la productividad del desarrollador para ciertas clases de apps, no un reemplazo universal de las GUIs retenidas.