UI-инженерия в эпоху ИИ
До ИИ кроссплатформенный Web был хорошим ответом. Теперь писать код дешевле, а проверять — пока нет. Шанс появился и у GPU UI, и у генерации нативных приложений для каждой платформы. Мы протестировали 10 фреймворков.
ОригиналПерепечатка без разрешения запрещена

12/12/2025 инженер Zed mikayla-maki закрыла PR с предложением добавить в GPUI пользовательские shader. Ответ был вежливым: сначала благодарность за вклад, затем объяснение: “we’re shifting focus to core product work at Zed, and without a Zed use case, I can’t validate this code”. В конце стоял смайлик.
GPUI — собственный GPU-фреймворк интерфейсов Zed. Его часто вспоминают среди альтернатив Electron. Менее чем за четыре месяца до этого Zed объявила о раунде на 32,000,000 долларов под руководством Sequoia. Общий объём инвестиций превысил 42,000,000 долларов.
Спустя девять с лишним месяцев, 26/9/2026, разработчик egoist создал репозиторий MyGo. За 39 дней в нём появилось 1,042 коммита, из них 890 — с подписью Claude.
Claude разрабатывает Anthropic. Собственное настольное приложение Anthropic использует Electron.
Вместе эти три факта выглядят немного странно. Мы измерили работу 10 фреймворков на двух компьютерах, чтобы понять, где сейчас находится эта область.
01Зачем мы провели сравнение
Настольные приложения Claude и Codex по-прежнему используют Electron: у Web зрелая экосистема, одна кодовая база работает на разных платформах, а модели хорошо её знают. ИИ снижает стоимость разработки, но совместимость и сопровождение разных платформ всё ещё требуют усилий.
Собственная GPU-отрисовка предлагает другой путь, однако GPUI по-прежнему отдаёт приоритет Zed. Кроссплатформенный рендеринг и экосистема компонентов требуют долгой работы. MyGo показывает, как ИИ и готовые компоненты ускоряют старт, но зрелость в эксплуатации и долгосрочная сопровождаемость ещё не подтверждены.
Flutter, Compose, Slint, egui и iced предлагают разные компромиссы. Мы протестировали 10 фреймворков в одинаковых сценариях, измерив плавность, CPU, память и точность воспроизведения дизайна, чтобы выяснить реальную цену каждого подхода.
02Мы провели локальные тесты
Мы протестировали 10 фреймворков с одинаковыми сценариями на Apple M4 Max и ThinkPad T14 Gen6. На обеих платформах измеряли CPU и память; для Windows также есть внешние измерения кадров через PresentMon. Кадровые колбэки Mac различаются между фреймворками и не используются для сравнения. Аппаратная часть и показатели памяти тоже отличаются, поэтому сравнение проводится только внутри каждой платформы.
Анимация — плотная сцена: 500 карточек размером 96×64 логических пикселя перекрываются в 25 столбцах. У каждой скругление 12, градиент 135° и тень с blur 16 и смещением вниз 4. Координаты всех карточек обновляются покадрово: они движутся по окружностям радиусом 12 с периодом 4 секунды. Приведена медиана пяти запусков по 30 секунд.
В основном измеряется нагрузка CPU при обновлении интерфейса, подготовке рисования и отправке рендеринга множества непрерывно движущихся элементов с эффектами, а также стабильность вывода кадров. CPU учитывает дерево процессов приложения, а не загрузку GPU или время отдельных этапов. Его нужно читать вместе с интервалами кадров: меньше кадров тоже может означать меньшую нагрузку CPU. 500 — число карточек в сцене; перекрытия и обрезка окном означают, что не все они полностью рисуются в каждом кадре.
Windows
| Фреймворк | Кадр списка | Кадр анимации | CPU потока | CPU правки | CPU анимации | RAM анимации |
|---|---|---|---|---|---|---|
| WPF (нативный) | 8.6 | 684 | 73% | 13% | 49% | 2,425 |
| Electron | 8.8 | 108 | 31% | 92% | 138% | 947 |
| Tauri | Невалидно | 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 |
С прокруткой списка справились все. Разница проявилась в анимации: на 500 карточках с тенями и градиентами фреймворки на Rust и Go с собственной отрисовкой в основном удерживали 120Hz. У Flutter, Electron, Tauri и Compose интервал между кадрами вырос до 80–160ms. Значение WPF в 684ms было вызвано 500 отдельными эффектами тени. После их отключения оно вернулось к 8.3ms, поэтому это не общая проблема.
Редактирование текста — ещё один барьер. При вставке 10 символов в секунду в документ из 5,000 строк Flutter, Compose и Slint полностью загружали одно ядро. Flutter в Windows также терял тридцать процентов ввода.
Mac
| Фреймворк | CPU потока | CPU правки | CPU анимации | Память списка | RAM анимации |
|---|---|---|---|---|---|
| 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 |
На Mac CPU анимации составлял около 15%–20% у GPUI, MyGo, egui и iced, 237% у Flutter и примерно 100% у Electron и Compose. При редактировании текста Flutter и Compose по-прежнему занимали почти целое ядро. У Slint было 52%, ниже его 99% в Windows.
В сцене списка примерно 40 MiB у SwiftUI, 340 MiB у GPUI и 800 MiB у egui прежде всего описывают память процессов приложения. Нативный UI может использовать системные службы рендеринга вне приложения: Apple указывает, что AppKit предпочитает рендерить дерево слоёв вне процесса. Часть рисования и композиции выполняется там. Собственные рендереры также используют системную композицию, но по одним процессам приложения нельзя сравнивать распределение работы. Унифицированная память чипов M означает общую физическую память CPU и GPU, а не учёт всех затрат в phys_footprint приложения.
В пяти коротких GPU-трассировках для каждой из сцен списка и анимации SwiftUI не наблюдались события исполнения GPU для PID приложения, тогда как WindowServer был активен. Это не означает, что SwiftUI не использует GPU, и не позволяет приписать ему весь рабочий стол. Базовая память WindowServer колебалась примерно на 205 MiB; отсутствие крупных общих объектов на снимках также не исключает повторное использование существующих системных ресурсов. Данные показывают лишь меньшую память процесса SwiftUI, но не меньшие полные затраты рендеринга и не оплату всей разницы системой.
Эти цифры относятся только к двум нашим компьютерам, этим версиям и написанным нами тестовым программам. Методика и полные данные приведены в разделе 05.
03Никогда не требовалось выбирать только один
У редакторов, инструментов разработки и бизнес-приложений разные требования к вводу текста, анимации, памяти, выпуску на разных платформах и экосистеме компонентов. У каждого свои сценарии. Выбор фреймворка зависит от того, какие компромиссы приемлемы.
Многие фреймворки также используют сохранение данных, кеширование и частичные обновления, чтобы не повторять расчёт компоновки и отрисовку. GPUI сочетает immediate и retained mode. Модель интерфейса, возможность повторного использования работы и время отрисовки кадра — разные вопросы.
MyGo, iced, GPUI, Slint и egui хорошо справляются с анимациями при низкой загрузке CPU. Slint потребляет меньше всего памяти, egui — довольно много, а компоненты редактирования для GPUI нужно добавлять самостоятельно. MyGo сейчас используется главным образом в приложениях самого автора и ещё не прошёл масштабной проверки в реальных условиях эксплуатации.
У Flutter, Electron и Compose также были неудовлетворительные интервалы кадров и потребление ресурсов в этом нагрузочном тесте анимации. Пакет Tauri занимает всего 11 MB, но потребление памяти во время работы примерно такое же, как у Electron.
04Узкое место — проверка
Сейчас мы считаем проверку важнее рендеринга.
Писать код стало дешевле, но проверка его правильности по-прежнему требует времени. В опросе разработчиков Stack Overflow за 2025 год 66% сталкивались с ответами ИИ “almost right, but not quite”, а 45.2% говорили, что отладка кода ИИ занимает больше времени. В опросе Sonar, опубликованном в 01/2026, 96% не полностью доверяли функциональной корректности сгенерированного кода. Только 48% утверждали, что всегда проверяют его до коммита. Sonar продаёт инструменты проверки кода, поэтому к цифрам стоит относиться с оговоркой, но они согласуются с предыдущим опросом.
Релизы Slint и egui прошли почти незаметно. Мы считаем их важнее прогресса в рендеринге. Агент должен уметь подавать ввод и делать скриншоты, чтобы что-то изменить, посмотреть и исправить снова. Раньше проверка интерфейса требовала человека у компьютера, который всё прокликивал. Теперь эту работу постепенно можно передавать машине.
Сейчас есть три подхода. У кроссплатформенного Web больше всего накопленных средств. Собственная отрисовка на GPU не требует браузера в комплекте, а порог её создания стал ниже. Нативное приложение для каждой платформы — самый старый способ. Раньше несколько команд могли содержать лишь крупные компании. Сейчас сложность — в утроении числа багов и объёма поддержки, о котором говорит Breunig. Если проверка подешевеет, а качество вырастет, прямая генерация нативного приложения для каждой платформы тоже может оказаться рабочим вариантом.
Мы тоже пробуем собственный GPU UI. Отличие — в переносе значительной части DX из Web: компонентов в духе JSX, стилей в духе CSS, компоновки flexbox, реактивного состояния и DevTools как в браузере, с последующей компиляцией в нативный код. Проект ещё на ранней стадии.
Мы не знаем, какой ответ победит. Возможно, несколько будут сосуществовать долго. Три факта из начала статьи не изменились. PR по-прежнему закрыт, MyGo растёт, а настольный Claude всё ещё использует Electron. Это очень интересное время.
05Отчёт об эксперименте
Тестирование проходило с 4 по 6 ноября 2026 года. Для каждого фреймворка реализовали одни и те же сценарии, используя рекомендуемые подходы, настройки по умолчанию и релизные сборки. После исправления размытия повторно измерили страницу дизайна Compose и сценарий простоя, который использует ту же реализацию.
| Параметр | Mac | Windows |
|---|---|---|
| Компьютер | Apple M4 Max, 16 ядер, 64 GB | ThinkPad T14 Gen6, Core Ultra 7 255H, встроенная GPU Arc 140T, 32 GB |
| Система | macOS 26.4 | Windows 11 Pro 10.0.26300 |
| Дисплей | Studio Display,60Hz,2x | 2880×1800,120Hz,200% |
| Окно | 1440×900 логических пикселей | 1280×720 логических пикселей; страница дизайна 1440×900 без рамки |
| Метрика памяти | phys_footprint | private commit (выделенная частная память, не физическое потребление) |
| Метрика кадров | Колбэки приложения; смысл зависит от фреймворка, не используются для сравнения | Интервал показа PresentMon 2.6.0, внешнее измерение |
| Состояние ПК | Не простаивает; во время теста идут другие задачи разработки | Без других действий пользователя |
| Фреймворк | Версия | Рендеринг Mac | Рендеринг Windows |
|---|---|---|---|
| SwiftUI / WPF | macOS 26.4 SDK / .NET Framework 4.8.1 | Системный композитинг | Стандартный конвейер WPF D3D9 |
| Electron | 45.2.2 | Не проверено | Chromium,ANGLE D3D11 |
| Tauri | 2.12.5 | WKWebView | WebView2 156,ANGLE D3D11 |
| GPUI | Zed c4273271 | Metal, настройки по умолчанию | Не проверено |
| MyGo | 86ec3b30 | Не проверено | Не проверено |
| 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 |
| Сценарий | Нагрузка |
|---|---|
| Покой | Показать страницу дизайна и не менять её, измеряя затраты в покое |
| Список | Виртуализированный список из 10,000 строк, высота 64, равномерная прокрутка со скоростью 2,000 px/s |
| Поток | Загрузить 200 старых сообщений, добавлять в последнее по 40 слов в секунду, всегда оставаясь внизу |
| Правка | Документ из 5,000 строк, вставка 10 символов в секунду у курсора |
| Анимация | 500 карточек 96×64, радиус 12, градиент и тень, движение по окружности по общей формуле |
| Страница дизайна | 11 требований к дизайну: шрифты, тени, тонкие линии, градиенты, P3, размытие фона, скругления, emoji, OpenType, смешанный набор китайского и английского |
Каждый сценарий для каждого фреймворка запускали 5 раз по 30 секунд, последовательно, в перемешанном порядке. Все значения ниже — медианы. Медианный размах между 5 прогонами составил около 3%, девять десятых укладывались в 24%. Список и анимацию измерили повторно после унификации требований, поэтому столбцы собраны не в одно время. Одно логическое ядро — 100% CPU. Для многопроцессных приложений учтены все дочерние процессы. Для Tauri на Mac также учтены процессы WebKit, запущенные системой для него. В кадровые данные Windows вошли только прогоны, однозначно относящиеся к одному swapchain и без потери записей.
Для потока и правки проверили фактически выполненный объём: Flutter в Windows завершил только 68% правки, остальные — более 99%.
| Фреймворк | Покой | Список | Поток | Правка | Анимация |
|---|---|---|---|---|---|
| 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 |
| Фреймворк | Покой | Список | Поток | Правка | Анимация |
|---|---|---|---|---|---|
| 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 |
| Фреймворк | Список p95 | Список p99 | Прогоны | Анимация p95 | Анимация p99 | Прогоны |
|---|---|---|---|---|---|---|
| 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 |
| Фреймворк | Покой | Список | Поток | Правка | Анимация |
|---|---|---|---|---|---|
| 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 |
| Фреймворк | Покой | Список | Поток | Правка | Анимация |
|---|---|---|---|---|---|
| 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 |
| Фреймворк | Запуск Mac | Запуск Windows | Размер Mac | Размер Windows |
|---|---|---|---|---|
| Нативные (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 |
Соответствие дизайну
Проверка размытия требует плавных переходов между цветными полосами на заданной панели внутри окна. Применение Modifier.blur с радиусом 24 dp к слою с полосами в Compose 1.12.2 дало плавные переходы на снимках нативных окон в macOS и Windows. SwiftUI тоже сначала размывает известный слой с полосами, затем добавляет полупрозрачную белую заливку. В обоих случаях проверялся именно этот слой. API Compose Desktop
В протестированных реализациях GPUI, iced, egui и Slint поверх полос наложен полупрозрачный слой. При повторной проверке границы полос остались резкими. Blurred в GPUI и window::Settings::blur в iced воздействуют на содержимое за окном. Во встроенных API рисования протестированных версий не обнаружено локального размытия фона. В iced локальные эффекты можно рисовать самостоятельно, а egui позволяет обращаться к бэкенду через PaintCallback. GPUI · Настройки окна iced · Колбэк рисования egui
Slint тестировали в версии 1.18.1 с FemtoVG. В этой версии у элементов не было свойства backdrop-blur. Позже разработчики добавили его для рендерера Skia. На снимках показан рендеринг FemtoVG в версии 1.18.1. Задача в репозитории Slint
Страница дизайна содержит 11 проверок. GPUI, egui, iced, Slint и Compose не воспроизвели образец P3 в проверенном выводе Mac. У снимков Windows нет цветового профиля, поэтому P3 не оценивается; флаги emoji отображаются буквами.
| Фреймворк | Компоновка | Текст | Доступность |
|---|---|---|---|
| GPUI | Taffy | CoreText на macOS | AccessKit |
| egui | Компоновка в immediate mode | epaint + harfrust | AccessKit |
| iced | Собственная flex-компоновка | cosmic-text | Связь с системой не найдена |
| Slint | Lowering при компиляции + компоновка при выполнении | Parley | AccessKit |
| Flutter | Ограничения RenderBox | SkParagraph | Мост дерева Semantics |
| Compose | MeasurePolicy | SkParagraph из Skiko | Semantics; Windows требует Java Access Bridge |
| Electron | Blink | Текстовый конвейер Chromium | Дерево доступности Chromium |
| Tauri | Системный WebView | Системный WebView | Доступ через WebView |
| SwiftUI | Stack / Layout | TextKit,Core Text | Встроено в систему |
Компоновка становится похожей, а текст различается сильнее всего. Когда iced запрашивал PingFang 700 в macOS, латинские буквы подменялись Menlo Bold.
Ограничения:
- Только один компьютер на платформу. Анимацию измеряли на встроенной GPU Intel; результаты могут не подходить для дискретных GPU.
- Mac во время тестов не простаивал. Кадровые данные — только колбэки приложения, для сравнения фреймворков они не используются.
- Семантика blur у теней различается. egui, iced и GPUI используют приближения. Компоненты редактирования тоже не равноценны: GPUI использует изменённый пример редактора.
- Таблицы CPU и памяти учитывают приложение и включённые вспомогательные процессы. Затраты WindowServer и драйвера не распределены по окнам, выгода повторного использования общих системных ресурсов не измерена; ранжировать полные системные затраты рендеринга по этим таблицам нельзя.
- Не удалось получить достоверные результаты для окон кандидатов метода ввода, дерева доступности Mac и энергопотребления.

