La ingeniería de UI en la era de la IA
Antes de la IA, la Web multiplataforma era una buena respuesta. Ahora escribir código cuesta menos, pero verificarlo no. Tanto las UI con GPU como la generación de aplicaciones nativas para cada plataforma tienen una oportunidad. Probamos 10 frameworks.
OriginalProhibida su reproducción sin permiso

El 12/12/2025, la ingeniera de Zed mikayla-maki cerró una PR que proponía añadir shaders personalizados a GPUI. La respuesta fue cordial. Agradeció la contribución y explicó: “we’re shifting focus to core product work at Zed, and without a Zed use case, I can’t validate this code”. Terminaba con una cara sonriente.
GPUI es el framework de interfaces con GPU que desarrolló Zed. Suele aparecer al hablar de alternativas a Electron. Menos de cuatro meses antes, Zed había anunciado una ronda de 32,000,000 de dólares liderada por Sequoia, con la que superaba los 42,000,000 recaudados en total.
Más de nueve meses después, el 26/9/2026, el desarrollador egoist creó un repositorio llamado MyGo. En 39 días acumuló 1,042 commits, 890 de ellos con la firma de Claude.
Claude es de Anthropic. La aplicación de escritorio de la propia Anthropic usa Electron.
Juntos, estos tres hechos resultan algo extraños. Medimos 10 frameworks en dos equipos para ver en qué punto está este sector.
01Por qué hicimos esta prueba
Aplicaciones de escritorio como Claude y Codex siguen usando Electron: la Web tiene un ecosistema maduro, una base de código sirve para varias plataformas y los modelos la conocen bien. La IA reduce el coste de desarrollo, pero la compatibilidad entre plataformas y el mantenimiento siguen exigiendo trabajo.
El renderizado propio con GPU ofrece otra vía, pero GPUI sigue dando prioridad a Zed. El renderizado multiplataforma y un ecosistema de componentes requieren inversión sostenida. MyGo muestra cómo la IA y los componentes existentes aceleran el arranque; su madurez en producción y su mantenimiento a largo plazo aún deben demostrarse.
Flutter, Compose, Slint, egui e iced toman decisiones distintas. Probamos 10 frameworks con los mismos escenarios, midiendo fluidez, CPU, memoria y fidelidad visual para conocer el coste real de cada enfoque.
02Hicimos pruebas locales
Probamos 10 frameworks con los mismos escenarios en un Apple M4 Max y un ThinkPad T14 Gen6. Medimos CPU y memoria en ambas plataformas; Windows cuenta además con mediciones externas de fotogramas mediante PresentMon. Los callbacks de fotogramas de Mac difieren entre frameworks y no se usan para compararlos. El hardware y las métricas de memoria también son distintos, por lo que solo comparamos dentro de cada plataforma.
La animación es una escena densa: 500 tarjetas de 96×64 píxeles lógicos, superpuestas en 25 columnas, con radio de esquina 12, degradado de 135° y sombra con blur 16 y desplazamiento vertical 4. Todas actualizan su posición en cada fotograma y describen círculos de radio 12 con un período de 4 segundos. Publicamos la mediana de cinco rondas de 30 segundos.
Medimos principalmente el coste de CPU al actualizar la interfaz, preparar el dibujo y enviar el renderizado de muchos elementos con efectos en movimiento continuo, además de la regularidad de los fotogramas. La CPU abarca el árbol de procesos de la aplicación; no mide uso de GPU ni tiempos por etapa. Debe leerse junto al intervalo entre fotogramas: producir menos también puede reducir la CPU. Las 500 tarjetas pertenecen a la escena; la superposición y el recorte de la ventana impiden que todas se dibujen completas en cada fotograma.
Windows
| Framework | Lista: intervalo | Anim.: intervalo | CPU flujo | CPU edición | CPU anim. | RAM anim. |
|---|---|---|---|---|---|---|
| WPF (nativo) | 8.6 | 684 | 73% | 13% | 49% | 2,425 |
| Electron | 8.8 | 108 | 31% | 92% | 138% | 947 |
| Tauri | No válido | 92 | 54% | 105% | 148% | 913 |
| GPUI | 8.6 | 16.7 | 24% | 4% | 22% | 142 |
| MyGo | 8.4 | 8.6 | 11% | 6% | 33% | 115 |
| egui | 8.8 | 8.5 | 12% | 20% | 49% | 388 |
| iced | 8.9 | 8.5 | 20% | 3% | 25% | 215 |
| Slint | 8.5 | 8.5 | 27% | 99% | 67% | 61 |
| Flutter | 8.4 | 80 | 22% | 105% | 91% | 4,934 |
| Compose | 8.8 | 160 | 34% | 106% | 102% | 2,422 |
Todos siguieron el ritmo al desplazar listas. La diferencia apareció en las animaciones: con 500 tarjetas con sombras y degradados, los frameworks de dibujo propio en Rust y Go mantuvieron en general los 120Hz. Flutter, Electron, Tauri y Compose llegaron a intervalos de 80 a 160ms. Los 684ms de WPF se debían a 500 efectos de sombra independientes. Al desactivarlos volvió a 8.3ms, así que no es un problema general.
La edición de texto es otro obstáculo. Al insertar 10 caracteres por segundo en un documento de 5,000 líneas, Flutter, Compose y Slint saturaron un núcleo. En Windows, Flutter perdió además un treinta por ciento de la entrada.
Mac
| Framework | CPU flujo | CPU edición | CPU anim. | Memoria de lista | RAM anim. |
|---|---|---|---|---|---|
| SwiftUI | 87.5% | 8.9% | 99.1% | 40 | 37 |
| Electron | 16.1% | 62.0% | 102.2% | 536 | 698 |
| Tauri | 42.1% | 86.9% | 78.7% | 753 | 555 |
| GPUI | 22.5% | 2.9% | 17.0% | 341 | 335 |
| MyGo | 8.2% | 2.8% | 16.3% | 368 | 371 |
| egui | 8.6% | 7.2% | 20.4% | 803 | 839 |
| iced | 18.2% | 7.5% | 15.0% | 489 | 491 |
| Slint | 18.4% | 52.1% | 26.7% | 423 | 416 |
| Flutter | 18.3% | 101.9% | 237.4% | 468 | 994 |
| Compose | 31.3% | 105.1% | 107.5% | 710 | 1,295 |
En Mac, el CPU de animación fue de aproximadamente 15%–20% para GPUI, MyGo, egui e iced, frente al 237% de Flutter y alrededor del 100% de Electron y Compose. Al editar texto, Flutter y Compose siguieron cerca de un núcleo completo. Slint usó un 52%, por debajo de su 99% en Windows.
En la lista, los aproximadamente 40 MiB de SwiftUI, 340 MiB de GPUI y 800 MiB de egui describen ante todo la huella de los procesos de la aplicación. La UI nativa puede usar servicios de renderizado del sistema externos: Apple documenta que AppKit prefiere renderizar los árboles de capas fuera del proceso. Parte del dibujo y la composición ocurre, por tanto, fuera de la aplicación. Los renderizadores propios también usan composición del sistema, pero sus cifras de proceso no bastan para comparar el reparto de trabajo. La memoria unificada de los chips M comparte memoria física entre CPU y GPU; no atribuye automáticamente todos los costes al phys_footprint de la aplicación.
En cinco trazas GPU cortas por escena de lista y animación de SwiftUI, no se observaron eventos de ejecución GPU del PID de la aplicación, mientras WindowServer tenía actividad. Esto no significa que SwiftUI no use GPU ni permite atribuirle todo el escritorio. La memoria base de WindowServer fluctuó unos 205 MiB; no encontrar grandes objetos compartidos en las instantáneas tampoco descarta reutilizar recursos existentes del sistema. Solo podemos concluir que el proceso de SwiftUI ocupa menos, no que todo su renderizado cueste menos ni que el sistema pague toda la diferencia.
Estas cifras solo describen estos dos equipos, estas versiones y nuestros programas de prueba. El método y los datos completos están en la sección 05.
03Nunca se trató de elegir solo uno
Editores, herramientas de desarrollo y aplicaciones de negocio tienen requisitos distintos de entrada de texto, animación, memoria, distribución multiplataforma y ecosistemas de componentes. Cada uno tiene sus casos de uso. Elegir un framework implica decidir qué compromisos son aceptables.
Muchos frameworks también recurren a la retención, la caché y las actualizaciones parciales para evitar repetir el cálculo de disposición y el dibujo. GPUI combina los modos inmediato y retenido. El modelo de interfaz, el trabajo que puede reutilizar y el tiempo que tarda en dibujar un fotograma son cuestiones distintas.
MyGo, iced, GPUI, Slint y egui responden bien en animaciones y consumen poca CPU. Slint es el que menos memoria usa, egui tiene un uso de memoria algo alto y GPUI requiere aportar los controles de edición. MyGo se usa actualmente sobre todo en las aplicaciones del propio autor y aún no ha sido validado a gran escala en producción.
Flutter, Electron y Compose también tuvieron intervalos entre fotogramas y consumo de recursos poco satisfactorios en esta prueba de estrés de animación. El paquete de Tauri ocupa solo 11 MB, pero su uso de memoria en ejecución es similar al de Electron.
04El cuello de botella es verificar
Ahora creemos que la verificación importa más que el renderizado.
Escribir código se ha abaratado, pero comprobar que sea correcto sigue llevando tiempo. En la encuesta de desarrolladores de Stack Overflow de 2025, el 66% había recibido soluciones de IA “almost right, but not quite”, y el 45.2% decía tardar más en depurar código de IA. En una encuesta publicada por Sonar en 01/2026, el 96% no confiaba plenamente en la corrección funcional del código generado por IA y solo el 48% afirmaba revisarlo siempre antes del commit. Sonar vende herramientas de inspección de código, así que conviene tomar sus cifras con cautela, aunque encajan con la otra encuesta.
Los lanzamientos de Slint y egui hicieron poco ruido. Nos parecen más importantes que los avances en renderizado. Los agentes necesitan inyectar entrada y tomar capturas para cambiar algo, mirarlo y volver a corregirlo. Antes, verificar una interfaz exigía que alguien se sentara ante el equipo y pulsara cada elemento. Ahora empieza a poder encargarse la máquina.
Hoy hay tres formas de hacerlo. La Web multiplataforma cuenta con más recursos. El dibujo propio con GPU no requiere llevar un navegador y la barrera para construirlo es menor que antes. Hacer una aplicación nativa por plataforma es el método más antiguo. Antes, solo las grandes empresas podían mantener varios equipos. Ahora la dificultad está en triplicar los bugs y el alcance del soporte, como señala Breunig. Si verificar cuesta menos y la calidad mejora, generar directamente una aplicación nativa para cada plataforma también podría funcionar.
También exploramos nuestra propia GPU UI. La diferencia consiste en incorporar gran parte de la DX de la Web: componentes similares a JSX, estilos similares a CSS, composición flexbox, estado reactivo y DevTools como los del navegador, para compilar al final a código nativo. Aún estamos al principio.
No sabemos qué respuesta ganará. Puede que varias convivan durante mucho tiempo. Los tres hechos del inicio siguen igual: la PR está cerrada, MyGo sigue creciendo y el escritorio de Claude sigue usando Electron. Es una época muy interesante.
05Informe experimental
Las pruebas se realizaron del 4 al 6 de noviembre de 2026. Se implementaron los mismos escenarios en cada framework con las prácticas recomendadas, la configuración predeterminada y compilaciones de lanzamiento. Tras corregir el desenfoque, se volvieron a medir la página de diseño de Compose y el escenario en reposo que comparte su implementación.
| Elemento | Mac | Windows |
|---|---|---|
| Equipo | Apple M4 Max, 16 núcleos, 64 GB | ThinkPad T14 Gen6, Core Ultra 7 255H, GPU integrada Arc 140T, 32 GB |
| Sistema | macOS 26.4 | Windows 11 Pro 10.0.26300 |
| Pantalla | Studio Display,60Hz,2x | 2880×1800,120Hz,200% |
| Ventana | 1440×900 píxeles lógicos | 1280×720 píxeles lógicos; página de diseño 1440×900 sin bordes |
| Métrica RAM | phys_footprint | private commit (memoria privada comprometida, no uso físico) |
| Métrica de fotogramas | Callbacks de la aplicación; varían según el framework y no se comparan | Intervalo de visualización de PresentMon 2.6.0, medición externa |
| Estado del equipo | No inactivo; otras tareas de desarrollo durante las pruebas | Sin otras acciones del usuario |
| Framework | Versión | Renderizado Mac | Renderizado Windows |
|---|---|---|---|
| SwiftUI / WPF | macOS 26.4 SDK / .NET Framework 4.8.1 | Composición del sistema | Pipeline D3D9 predeterminado de WPF |
| Electron | 45.2.2 | Sin verificar | Chromium,ANGLE D3D11 |
| Tauri | 2.12.5 | WKWebView | WebView2 156,ANGLE D3D11 |
| GPUI | Zed c4273271 | Metal, configuración predeterminada | Sin verificar |
| MyGo | 86ec3b30 | Sin verificar | Sin verificar |
| egui | eframe 0.37.0 | Metal | Vulkan |
| iced | 0.14.0 | Metal | Vulkan |
| Slint | 1.18.1 | FemtoVG,OpenGL | FemtoVG,OpenGL ES |
| Flutter | 3.47.9 | Impeller,Metal | Impeller,ANGLE D3D11 |
| Compose | 1.12.2 | Skiko,Metal | Skiko,D3D12 |
| Escenario | Carga de trabajo |
|---|---|
| Reposo | Mostrar la página de diseño y dejarla quieta para medir el coste en reposo |
| Lista | Lista virtualizada de 10,000 filas, altura 64, desplazamiento constante a 2,000 px/s |
| Flujo | Cargar 200 mensajes previos y añadir 40 palabras por segundo al último, siempre al fondo |
| Edición | Documento de 5,000 líneas; insertar 10 caracteres por segundo en el cursor |
| Animación | 500 tarjetas de 96×64, radio 12, degradado y sombra; movimiento circular con una fórmula común |
| Página de diseño | 11 especificaciones: fuentes, sombras, líneas finas, degradados, P3, desenfoque de fondo, esquinas, emoji, OpenType y composición mixta en chino e inglés |
Cada escenario se ejecutó 5 veces por framework, durante 30 segundos por ronda, en serie y con orden aleatorio. Todas las tablas muestran medianas. La mediana del rango entre las 5 rondas fue de aproximadamente el 3%; el noventa por ciento quedó dentro del 24%. Repetimos lista y animación tras unificar las especificaciones, por lo que las columnas no se recogieron en el mismo periodo. CPU: un núcleo lógico es el 100%. Las aplicaciones multiproceso incluyen todos los procesos hijos. En Tauri para Mac también contamos los procesos WebKit que el sistema inicia para él. Para fotogramas de Windows solo usamos rondas atribuibles de forma única a un swapchain y sin pérdida de registros.
Verificamos el trabajo realmente completado tanto en flujo como en edición: Flutter en Windows solo completó el 68% de la edición; todos los demás superaron el 99%.
| Framework | Reposo | Lista | Flujo | Edición | Animación |
|---|---|---|---|---|---|
| WPF | 2.6 | 37.2 | 72.7 | 13.5 | 49.3 |
| Electron | 6.1 | 42.8 | 30.6 | 92.1 | 137.8 |
| Tauri | 31.6 | 58.2 | 53.7 | 104.9 | 147.8 |
| GPUI | 1.5 | 10.6 | 24.3 | 3.6 | 21.5 |
| MyGo | 0.0 | 17.9 | 10.6 | 6.3 | 32.8 |
| egui | 0.3 | 15.9 | 12.2 | 19.6 | 48.9 |
| iced | 0.3 | 21.3 | 20.2 | 3.0 | 24.5 |
| Slint | 0.3 | 62.7 | 26.9 | 99.1 | 66.8 |
| Flutter | 0.6 | 31.2 | 21.8 | 104.6 | 90.6 |
| Compose | 0.5 | 35.9 | 34.4 | 106.4 | 101.8 |
| Framework | Reposo | Lista | Flujo | Edición | Animación |
|---|---|---|---|---|---|
| WPF | 157 | 193 | 250 | 206 | 2,425 |
| Electron | 280 | 397 | 392 | 556 | 947 |
| Tauri | 260 | 313 | 346 | 536 | 913 |
| GPUI | 135 | 142 | 160 | 138 | 142 |
| MyGo | 132 | 135 | 133 | 132 | 115 |
| egui | 379 | 386 | 396 | 460 | 388 |
| iced | 212 | 224 | 274 | 321 | 215 |
| Slint | 79 | 87 | 72 | 202 | 61 |
| Flutter | 636 | 396 | 374 | 667 | 4,934 |
| Compose | 421 | 544 | 574 | 3,372 | 2,422 |
| Framework | Lista p95 | Lista p99 | Rondas | Anim. p95 | Anim. p99 | Rondas |
|---|---|---|---|---|---|---|
| WPF | 8.6 | 8.7 | 5 | 684.3 | 719.3 | 5 |
| Electron | 8.8 | 8.9 | 4 | 108.3 | 115.9 | 2 |
| Tauri | — | — | 0 | 91.7 | 100.0 | 5 |
| GPUI | 8.6 | 8.8 | 5 | 16.7 | 25.1 | 5 |
| MyGo | 8.4 | 8.7 | 5 | 8.6 | 16.7 | 5 |
| egui | 8.8 | 8.9 | 5 | 8.5 | 8.7 | 5 |
| iced | 8.9 | 8.9 | 5 | 8.5 | 8.6 | 5 |
| Slint | 8.5 | 8.8 | 5 | 8.5 | 8.7 | 5 |
| Flutter | 8.4 | 8.6 | 5 | 80.5 | 88.6 | 5 |
| Compose | 8.8 | 8.9 | 5 | 160.3 | 211.8 | 5 |
| Framework | Reposo | Lista | Flujo | Edición | Animación |
|---|---|---|---|---|---|
| SwiftUI | 1.0 | 16.9 | 87.5 | 8.9 | 99.1 |
| Electron | 2.5 | 16.7 | 16.1 | 62.0 | 102.2 |
| Tauri | 6.3 | 32.0 | 42.1 | 86.9 | 78.7 |
| GPUI | 0.4 | 9.7 | 22.5 | 2.9 | 17.0 |
| MyGo | 0.1 | 13.2 | 8.2 | 2.8 | 16.3 |
| egui | 0.1 | 9.0 | 8.6 | 7.2 | 20.4 |
| iced | 0.1 | 24.2 | 18.2 | 7.5 | 15.0 |
| Slint | 0.1 | 13.1 | 18.4 | 52.1 | 26.7 |
| Flutter | 0.2 | 11.0 | 18.3 | 101.9 | 237.4 |
| Compose | 0.4 | 23.3 | 31.3 | 105.1 | 107.5 |
| Framework | Reposo | Lista | Flujo | Edición | Animación |
|---|---|---|---|---|---|
| SwiftUI | 32 | 40 | 136 | 293 | 37 |
| Electron | 205 | 536 | 567 | 707 | 698 |
| Tauri | 101 | 753 | 601 | 570 | 555 |
| GPUI | 74 | 341 | 358 | 320 | 335 |
| MyGo | 75 | 368 | 361 | 356 | 371 |
| egui | 414 | 803 | 817 | 862 | 839 |
| iced | 75 | 489 | 541 | 598 | 491 |
| Slint | 151 | 423 | 386 | 434 | 416 |
| Flutter | 156 | 468 | 455 | 663 | 994 |
| Compose | 350 | 710 | 709 | 1,426 | 1,295 |
| Framework | Inicio Mac | Inicio Windows | Tamaño Mac | Tamaño Windows |
|---|---|---|---|---|
| Nativo (SwiftUI / WPF) | 228 | 449 | 3.0 | <0.1 |
| Electron | 295 | 818 | 267.0 | 376.4 |
| Tauri | 565 | 622 | 12.5 | 11.2 |
| GPUI | 255 | 277 | 11.9 | 13.4 |
| MyGo | 742 | 126 | 13.1 | 11.5 |
| egui | 309 | 277 | 17.4 | 17.4 |
| iced | 257 | 590 | 14.4 | 14.2 |
| Slint | 261 | 272 | 18.5 | 17.0 |
| Flutter | 244 | 1,043 | 43.9 | 30.0 |
| Compose | 550 | 1,074 | 123.1 | 113.8 |
Fidelidad al diseño
La prueba de desenfoque requiere suavizar las franjas de color en un panel concreto dentro de la ventana. Al aplicar Modifier.blur con 24 dp a la capa de franjas en Compose 1.12.2, las capturas de ventanas nativas de Mac y Windows mostraron transiciones suaves. SwiftUI también desenfoca primero la capa de franjas conocida y después superpone blanco translúcido. La verificación de ambos métodos se limita a esa capa. API de Compose Desktop
Las implementaciones probadas de GPUI, iced, egui y Slint superpusieron una capa translúcida sobre las franjas. Los bordes de color siguieron siendo nítidos en la repetición. Blurred de GPUI y window::Settings::blur de iced actúan sobre el contenido situado detrás de la ventana. No encontramos una API de dibujo integrada para desenfocar fondos locales en las versiones probadas. iced permite dibujar efectos locales con renderizado personalizado, y egui puede acceder al motor de renderizado mediante PaintCallback. GPUI · Configuración de ventana de iced · Callback de dibujo de egui
La prueba de Slint se hizo con la versión 1.18.1 y FemtoVG. Esa versión carecía de la propiedad de elemento backdrop-blur. El proyecto la añadió después para el renderizador Skia. Las capturas muestran la ruta de FemtoVG en la versión 1.18.1. Incidencia de Slint
La página de diseño tiene 11 comprobaciones. GPUI, egui, iced, Slint y Compose no reprodujeron la muestra P3 en la salida Mac probada. Las capturas Windows no tienen perfil de color, por lo que no se evalúa P3; las banderas emoji aparecen como letras.
| Framework | Composición | Texto | Accesibilidad |
|---|---|---|---|
| GPUI | Taffy | CoreText en macOS | AccessKit |
| egui | Composición en modo inmediato | epaint + harfrust | AccessKit |
| iced | Composición flex propia | cosmic-text | Sin puente al sistema identificado |
| Slint | Lowering al compilar + composición en ejecución | Parley | AccessKit |
| Flutter | Restricciones RenderBox | SkParagraph | Puente del árbol Semantics |
| Compose | MeasurePolicy | SkParagraph de Skiko | Semantics; Windows requiere Java Access Bridge |
| Electron | Blink | Pipeline de texto de Chromium | Árbol de accesibilidad de Chromium |
| Tauri | WebView del sistema | WebView del sistema | Expuesto mediante WebView |
| SwiftUI | Stack / Layout | TextKit,Core Text | Integrado en el sistema |
La composición converge; la mayor diferencia está en el texto. Al pedir PingFang 700 en macOS, iced recurrió a Menlo Bold para las letras latinas.
Limitaciones:
- Solo hay un equipo por plataforma. Los resultados de animación proceden de una GPU integrada Intel y pueden no ser aplicables a GPU dedicadas.
- El Mac no estaba inactivo. Los datos de fotogramas son solo callbacks de la aplicación y no se comparan entre frameworks.
- La semántica de blur de las sombras varía. egui, iced y GPUI usan aproximaciones. Los controles de edición tampoco son equivalentes: GPUI usa un editor de ejemplo modificado.
- Las tablas de CPU y memoria cubren la aplicación y los procesos auxiliares incluidos. No reparten por ventana los costes de WindowServer y del controlador ni cuantifican la reutilización de recursos compartidos del sistema; no permiten clasificar el coste total de renderizado del sistema.
- No obtuvimos resultados válidos para las ventanas de candidatos del método de entrada, el árbol de accesibilidad de Mac ni el consumo energético.

