- egui es una biblioteca GUI de modo inmediato (Immediate Mode) escrita en Rust, que funciona en entornos web y nativos
- En la web se compila a WebAssembly y renderiza mediante WebGL, mientras que en entornos nativos soporta varias plataformas como Mac, Linux y Windows
- Está implementada únicamente con Rust puro, sin DOM, HTML, JS ni CSS
- Fue diseñada para ser fácil de usar, altamente portable y ofrecer alto rendimiento
Características principales
1. Modo inmediato (Immediate Mode)
2. Compatibilidad entre plataformas
- Web: funciona mediante WebAssembly y WebGL
- Nativo: soporta Mac, Linux, Windows, Android y más
- Puede integrarse con motores de juego (por ejemplo, integración con Bevy)
3. Integración con el ecosistema de Rust
- Ofrece el framework oficial
eframe:
- Permite escribir aplicaciones web y nativas con el mismo código
- Dependencias livianas:
- egui usa solo dependencias mínimas de Rust como ab_glyph y ahash
- Las dependencias pesadas están separadas en crates aparte (como
egui_extras)
Funciones principales
- Widgets: botones, sliders, checkboxes, radio buttons, edición de texto, selector de color y más
- Layout: soporte para disposición horizontal, vertical, por columnas y ajuste automático de línea
- Edición de texto: multilínea, copiar/pegar, soporte para emoji
- Ventanas: mover, redimensionar, minimizar/cerrar
- Renderizado: texto con antialiasing y renderizado de formas
- Accesibilidad: soporte para lectores de pantalla mediante integración con AccessKit
Ventajas y desventajas
- Ventajas
- Simplicidad: permite crear GUI con código conciso sin callbacks
- Portabilidad: el mismo código puede ejecutarse en web y en entorno nativo
- Usabilidad: no hay problemas de sincronización entre el estado de la aplicación y el estado de la GUI
- Desventajas
- Complejidad del layout: por la naturaleza del modo inmediato, los layouts complejos requieren trabajo adicional
- Uso de CPU: como hay que calcular todo el layout en cada frame, el rendimiento puede degradarse en interfaces grandes
Usuarios objetivo
- Desarrolladores que quieran crear una GUI simple rápidamente
- Usuarios que quieran añadir una GUI a motores de juego o proyectos basados en Rust
- Creadores de aplicaciones que necesiten soportar tanto web como entornos nativos
Explicación adicional sobre el modo inmediato
- A diferencia del modo retenido (retained mode) basado en callbacks, el modo inmediato procesa el estado de forma instantánea en cada frame
- Ejemplo:
if ui.button("Save").clicked() { save(); }
- Ventaja: el flujo del código se simplifica y no hay problemas de sincronización de estado
- Desventaja: el cálculo del layout es más complejo y puede afectar el rendimiento en interfaces grandes
1 comentarios
Comentarios en Hacker News
Intentó entender problemas matemáticos usando frameworks de Rust, pero el ciclo edit-compile-run era demasiado largo, lo que le dificultó avanzar. Se pregunta si dividir el proyecto en módulos podría mejorar esto
Si el navegador no soporta renderizado subpíxel, las bibliotecas de renderizado de UI basadas en canvas quedan en desventaja frente a las basadas en DOM, excepto en dispositivos de alta resolución. La biblioteca egui también reconoce este problema
La página de demos compilada para el navegador es técnicamente impresionante, pero cuesta imaginar las posibilidades de las apps hechas con egui. Se pregunta si hay ejemplos interesantes que usen egui
En Navidad se portó mal al hacer unwrap forzado de un
Optionen vez de usar pattern matching, y eso provocó un error. Ocurre en la versión móvil de BraveEl soporte de internacionalización es limitado. Por ejemplo, si se pega el "hello" en árabe, aparece como cuadros
Se pregunta qué significa "modo inmediato". La forma de agregar widgets a la UI usa
.add(). Se pregunta si una API fluida de builder para estos widgets es lo que lo convierte en "modo inmediato"Se pregunta cómo depurar este tipo de interfaces en el navegador web. Quiere saber si se puede depurar como JavaScript o como WebAssembly de C++
Hay problemas con el cambio de tamaño de la ventana. En el ejemplo "Highlighting", si se hace clic en el área de agarre de la esquina inferior derecha, la flecha diagonal cambia a una flecha vertical y solo permite redimensionar verticalmente. En otros ejemplos por defecto también parece que debería poder redimensionarse vertical y horizontalmente al mismo tiempo, pero no se puede ajustar en vertical
La respuesta a la entrada es muy lenta. Si se escribe rápido, la entrada no logra seguir el ritmo. No es posible seleccionar ni copiar texto, lo cual es un gran problema para implementar una GUI personalizada. Les desea a todos unas felices fiestas de fin de año