En profundidad

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

Tres ventanas representan Web, UI dibujada por GPU y nativo; sus líneas convergen en una marca roja de verificación.

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.

500 tarjetas redondeadas azules y violetas superpuestas, con degradados y sombras
Fig. 1Escena de estrés de animación: 500 tarjetas con degradados y sombras. Electron / macOS, captura de la aplicación de prueba congelada en la posición inicial.

Windows

Tabla 1Mediciones en Windows, mediana de 5 rondas. Fotogramas: intervalo de visualización p95 (ms); 8.3 equivale a 120Hz completos. CPU: un núcleo lógico es el 100%. Memoria: private commit (MiB).
FrameworkLista: intervaloAnim.: intervaloCPU flujoCPU ediciónCPU anim.RAM anim.
WPF (nativo)8.668473%13%49%2,425
Electron8.810831%92%138%947
TauriNo válido9254%105%148%913
GPUI8.616.724%4%22%142
MyGo8.48.611%6%33%115
egui8.88.512%20%49%388
iced8.98.520%3%25%215
Slint8.58.527%99%67%61
Flutter8.48022%105%91%4,934
Compose8.816034%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

Tabla 2Mediciones de Mac, medianas de 5 rondas. CPU: un núcleo lógico equivale al 100%; memoria: phys_footprint (MiB). La máquina no estaba inactiva. No se publican tasas de fotogramas comparables entre frameworks.
FrameworkCPU flujoCPU ediciónCPU anim.Memoria de listaRAM anim.
SwiftUI87.5%8.9%99.1%4037
Electron16.1%62.0%102.2%536698
Tauri42.1%86.9%78.7%753555
GPUI22.5%2.9%17.0%341335
MyGo8.2%2.8%16.3%368371
egui8.6%7.2%20.4%803839
iced18.2%7.5%15.0%489491
Slint18.4%52.1%26.7%423416
Flutter18.3%101.9%237.4%468994
Compose31.3%105.1%107.5%7101,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.

Tabla 3Entornos de prueba. Los equipos difieren en hardware, ventanas y métricas de memoria. Solo comparamos dentro de cada plataforma, no valores absolutos entre plataformas.
ElementoMacWindows
EquipoApple M4 Max, 16 núcleos, 64 GBThinkPad T14 Gen6, Core Ultra 7 255H, GPU integrada Arc 140T, 32 GB
SistemamacOS 26.4Windows 11 Pro 10.0.26300
PantallaStudio Display,60Hz,2x2880×1800,120Hz,200%
Ventana1440×900 píxeles lógicos1280×720 píxeles lógicos; página de diseño 1440×900 sin bordes
Métrica RAMphys_footprintprivate commit (memoria privada comprometida, no uso físico)
Métrica de fotogramasCallbacks de la aplicación; varían según el framework y no se comparanIntervalo de visualización de PresentMon 2.6.0, medición externa
Estado del equipoNo inactivo; otras tareas de desarrollo durante las pruebasSin otras acciones del usuario
Tabla 4Frameworks y versiones probados. Las rutas de renderizado proceden de registros de ejecución o de valores devueltos por las API. “Sin verificar” indica que no obtuvimos evidencia en ejecución.
FrameworkVersiónRenderizado MacRenderizado Windows
SwiftUI / WPFmacOS 26.4 SDK / .NET Framework 4.8.1Composición del sistemaPipeline D3D9 predeterminado de WPF
Electron45.2.2Sin verificarChromium,ANGLE D3D11
Tauri2.12.5WKWebViewWebView2 156,ANGLE D3D11
GPUIZed c4273271Metal, configuración predeterminadaSin verificar
MyGo86ec3b30Sin verificarSin verificar
eguieframe 0.37.0MetalVulkan
iced0.14.0MetalVulkan
Slint1.18.1FemtoVG,OpenGLFemtoVG,OpenGL ES
Flutter3.47.9Impeller,MetalImpeller,ANGLE D3D11
Compose1.12.2Skiko,MetalSkiko,D3D12
Tabla 5Escenarios de prueba. Los controlan temporizadores internos, sin intervención manual. Los datos se generan con una semilla fija.
EscenarioCarga de trabajo
ReposoMostrar la página de diseño y dejarla quieta para medir el coste en reposo
ListaLista virtualizada de 10,000 filas, altura 64, desplazamiento constante a 2,000 px/s
FlujoCargar 200 mensajes previos y añadir 40 palabras por segundo al último, siempre al fondo
EdiciónDocumento de 5,000 líneas; insertar 10 caracteres por segundo en el cursor
Animación500 tarjetas de 96×64, radio 12, degradado y sombra; movimiento circular con una fórmula común
Página de diseño11 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%.

Tabla 6CPU de Windows, en %.
FrameworkReposoListaFlujoEdiciónAnimación
WPF2.637.272.713.549.3
Electron6.142.830.692.1137.8
Tauri31.658.253.7104.9147.8
GPUI1.510.624.33.621.5
MyGo0.017.910.66.332.8
egui0.315.912.219.648.9
iced0.321.320.23.024.5
Slint0.362.726.999.166.8
Flutter0.631.221.8104.690.6
Compose0.535.934.4106.4101.8
Tabla 7Memoria de Windows, private commit, en MiB.
FrameworkReposoListaFlujoEdiciónAnimación
WPF1571932502062,425
Electron280397392556947
Tauri260313346536913
GPUI135142160138142
MyGo132135133132115
egui379386396460388
iced212224274321215
Slint79877220261
Flutter6363963746674,934
Compose4215445743,3722,422
Tabla 8Intervalo de visualización de Windows, en ms. A 120Hz, 8.33 corresponde a la frecuencia máxima. Rondas indica cuántas tienen datos de fotogramas válidos.
FrameworkLista p95Lista p99RondasAnim. p95Anim. p99Rondas
WPF8.68.75684.3719.35
Electron8.88.94108.3115.92
Tauri——091.7100.05
GPUI8.68.8516.725.15
MyGo8.48.758.616.75
egui8.88.958.58.75
iced8.98.958.58.65
Slint8.58.858.58.75
Flutter8.48.6580.588.65
Compose8.88.95160.3211.85
Tabla 9CPU de Mac, en %. Equipo no inactivo.
FrameworkReposoListaFlujoEdiciónAnimación
SwiftUI1.016.987.58.999.1
Electron2.516.716.162.0102.2
Tauri6.332.042.186.978.7
GPUI0.49.722.52.917.0
MyGo0.113.28.22.816.3
egui0.19.08.67.220.4
iced0.124.218.27.515.0
Slint0.113.118.452.126.7
Flutter0.211.018.3101.9237.4
Compose0.423.331.3105.1107.5
Tabla 10Memoria de Mac, phys_footprint, en MiB.
FrameworkReposoListaFlujoEdiciónAnimación
SwiftUI324013629337
Electron205536567707698
Tauri101753601570555
GPUI74341358320335
MyGo75368361356371
egui414803817862839
iced75489541598491
Slint151423386434416
Flutter156468455663994
Compose3507107091,4261,295
Tabla 11Inicio: desde lanzar el proceso hasta el primer callback de fotograma (ms), no la primera pantalla con caché fría. Tamaño: directorio de distribución (MB), sin WebView del sistema ni .NET.
FrameworkInicio MacInicio WindowsTamaño MacTamaño Windows
Nativo (SwiftUI / WPF)2284493.0<0.1
Electron295818267.0376.4
Tauri56562212.511.2
GPUI25527711.913.4
MyGo74212613.111.5
egui30927717.417.4
iced25759014.414.2
Slint26127218.517.0
Flutter2441,04343.930.0
Compose5501,074123.1113.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

Paneles de franjas en diez frameworks. Compose, SwiftUI, Electron, Tauri, MyGo y Flutter muestran transiciones suaves. Los otros cuatro conservan bordes nítidos entre franjas.
Fig. 2Capturas de ventanas nativas de Mac a 2×, recortadas al mismo panel de franjas y reducidas proporcionalmente.

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.

Tabla 12Tecnologías de los módulos clave, según el código y la documentación oficial de las versiones fijadas.
FrameworkComposiciónTextoAccesibilidad
GPUITaffyCoreText en macOSAccessKit
eguiComposición en modo inmediatoepaint + harfrustAccessKit
icedComposición flex propiacosmic-textSin puente al sistema identificado
SlintLowering al compilar + composición en ejecuciónParleyAccessKit
FlutterRestricciones RenderBoxSkParagraphPuente del árbol Semantics
ComposeMeasurePolicySkParagraph de SkikoSemantics; Windows requiere Java Access Bridge
ElectronBlinkPipeline de texto de ChromiumÁrbol de accesibilidad de Chromium
TauriWebView del sistemaWebView del sistemaExpuesto mediante WebView
SwiftUIStack / LayoutTextKit,Core TextIntegrado 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.
E

Equipo editorial de ui.surf

Equipo editorial de ui.surf · 1 artículo