深度

AI 提升效率之後,重新看待 UI 工程

Web 跨平台是 AI 出現前的好答案。現在寫程式的成本降低了,驗證還沒有,GPU UI 和為各平台直接產生原生應用程式都有了機會。我們實測了 10 個框架。

原創未經許可,不得以任何形式轉載

三個視窗分別代表 Web、GPU 自繪和原生,連線匯聚後通向一個紅色的驗證標記

2025 年 12 月 12 日,Zed 工程師 mikayla-maki 關閉了一個 PR。那個 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 是 Zed 自行開發的 GPU 介面框架,談到 Electron 的替代方案時,經常有人提起它。不到四個月前,Zed 才剛宣布取得紅杉領投的 3200 萬美元,累計募資超過 4200 萬。

九個多月後,2026 年 9 月 26 日,開發者 egoist 建立了一個叫做 MyGo 的儲存庫。39 天後,這個儲存庫有 1,042 次提交,其中 890 次有 Claude 署名。

Claude 出自 Anthropic。Anthropic 自己的桌面應用程式,用的是 Electron。

這三件事放在一起,有點不對勁。我們在兩台電腦上實測了 10 個框架,想看看這個領域走到了哪一步。

01評測背景

Electron 仍被 Claude、Codex 等桌面應用程式採用:Web 生態成熟,一份程式碼能跨平台,模型也熟悉。AI 降低了開發成本,但跨平台相容與維護仍需投入。

GPU 自繪提供了另一條路,但 GPUI 仍優先服務 Zed,跨平台繪圖與元件生態需要長期累積。MyGo 展示了 AI 與現成元件如何加快起步,正式環境的成熟度與長期維護能力仍待驗證。

Flutter、Compose、Slint、egui、iced 等框架各有取捨。我們選了 10 個框架,在相同情境下實測流暢度、CPU、記憶體與設計還原,看看這些路線的實際代價。

02我們在本機測了一遍

我們在 Apple M4 Max 和 ThinkPad T14 Gen6 上,以相同情境測試了 10 個框架。兩端都測 CPU 與記憶體;Windows 另有 PresentMon 的外部影格測量。Mac 的影格回呼定義不一,不用於跨框架比較。硬體與記憶體指標也不同,以下只在各自平台內比較。

動效是一個密集場景:500 張 96×64 邏輯像素的卡片,排成 25 列並相互重疊,每張帶圓角 12、135° 漸層和 blur 16、向下偏移 4 的陰影。所有卡片同時按幀更新位置,繞各自中心做半徑 12、週期 4 秒的圓周運動。每輪持續 30 秒,跑 5 輪取中位數。

主要看大量帶效果的元素持續移動時,框架更新介面、組織繪製和提交渲染的 CPU 成本,以及能否穩定出幀。CPU 是整個應用程式程序樹的占用,不是 GPU 使用率,也沒有拆分各階段耗時;要結合幀間隔看,少出幀也可能讓 CPU 更低。500 是場景中的卡片數,遮擋和視窗裁切意味著並非每幀都完整繪製 500 張。

500 張藍紫色圓角卡片相互重疊,帶漸層和陰影
圖 1動效壓測場景:500 張帶漸層和陰影的卡片。Electron / macOS,固定在起始位置的實測程式截圖。

Windows

表 1Windows 實測,5 輪中位數。影格指 p95 顯示間隔(ms),8.3 即達到完整 120Hz。CPU 以一個邏輯核心為 100%。記憶體為 private commit(MiB)。
框架列表影格動效影格串流 CPU編輯 CPU動效 CPU動效記憶體
WPF(原生)8.668473%13%49%2,425
Electron8.810831%92%138%947
Tauri無效9254%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

列表捲動大家都跟得上。差距出在動效:500 張帶陰影與漸層的卡片,Rust 和 Go 的自繪框架大致維持住了 120Hz,Flutter、Electron、Tauri、Compose 的影格間隔則來到 80 至 160ms。WPF 的 684ms 來自 500 個獨立陰影效果,關掉就回到 8.3ms,不算通病。

文字編輯是另一道門檻。在 5,000 行文件中每秒插入 10 個字元,Flutter、Compose、Slint 都用滿一個核心,Flutter 在 Windows 上還漏掉了三成輸入。

Mac

表 2Mac 實測,5 輪中位數。CPU 以一個邏輯核心為 100%;記憶體為 phys_footprint(MiB)。測試時電腦非閒置,不提供可跨框架比較的影格率。
框架串流 CPU編輯 CPU動效 CPU列表記憶體動效記憶體
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

Mac 上,GPUI、MyGo、egui、iced 的動效 CPU 約為 15%–20%,Flutter 為 237%,Electron 和 Compose 約 100%。文字編輯時,Flutter 和 Compose 仍接近一個核心,Slint 則為 52%,低於它在 Windows 上的 99%。

列表場景中,SwiftUI 約 40 MiB、GPUI 約 340 MiB、egui 約 800 MiB,首先反映的是應用程式程序的記憶體足跡。原生 UI 可以利用系統的程序外渲染服務:Apple 明確說明 AppKit 通常在程序外渲染圖層樹,因此部分繪製與合成工作並不發生在應用程式程序裡。自繪框架也要經過系統合成,但兩條路徑在應用程式與系統之間如何分工,不能只看應用程式程序判斷。M 系列的統一記憶體讓 CPU 和 GPU 共用實體記憶體,並不意味著所有相關成本都會計入應用程式的 phys_footprint。

本次 SwiftUI 列表和動效各 5 輪短時 GPU trace 中,未觀測到應用程式 PID 的 GPU 執行事件,同期 WindowServer 有 GPU 活動;這不代表 SwiftUI 不用 GPU,也不能把整個桌面的活動都算給它。WindowServer 記憶體基線還存在約 205 MiB 的波動,快照未見大額共享物件,也不足以排除系統既有資源的複用。因此,這組數據只能說明 SwiftUI 的應用程式程序占用較低,不能據此斷言完整渲染成本更低,也不能把差額全部歸為系統代付。

這些數字只代表這兩台電腦、這些版本和我們寫的測試程式。方法和完整資料在第 05 節。

03從來都不是極限N選1

編輯器、開發工具、業務應用程式,對文字輸入、動效、記憶體、跨平台交付與元件生態的要求不一樣。大家都有各自的使用情境,選型要看這些取捨能不能接受。

不少框架現在也在做保留、快取與局部更新,減少重複的版面配置與繪製。GPUI 是即時與保留混合的設計。採用哪種模式、哪些工作能重用,和一個影格能畫多快,是不同層面的問題。

動效方面,MyGo、iced、GPUI、Slint、egui 都跟得上,CPU 使用率也低。Slint 記憶體用量最小,egui 記憶體用量偏高,GPUI 的編輯控制項要自己補。MyGo 目前主要是作者自己的應用程式在使用,並沒有經過大規模的正式環境驗證。

Flutter、Electron、Compose 在這次動效壓測中的幀間隔和資源占用也不理想。Tauri 的套件只有 11 MB,執行時記憶體用量和 Electron 差不多。

04瓶頸在驗證

我們現在覺得,比渲染更重要的是驗證。

寫程式的成本降低了,確認程式碼寫對了還是要花時間。在 Stack Overflow 2025 年開發者調查中,66% 的人遇過 AI 給的方案「almost right, but not quite」,45.2% 說除錯 AI 寫的程式碼更費時間。Sonar 今年 1 月公布的調查則顯示,96% 的開發者不完全相信 AI 產生的程式碼功能正確,只有 48% 表示提交前一定會檢查。Sonar 販售程式碼檢查工具,這個數字要保留一點看法,但和前一份調查相符。

Slint 和 egui 那兩次發布沒有引起太多關注,我們認為卻比渲染上的進展更重要。agent 能注入輸入、擷取畫面,才能改一下、看一眼,再改。以前驗證介面,要有人坐在電腦前逐一點選,現在這件事開始能交給機器。

眼前有三種做法。Web 跨平台手上的資源最多。GPU 自繪不用帶著瀏覽器走,門檻也比以前低了。每個平台各做原生應用是最老的方法,以前只有大公司養得起好幾支團隊,現在的難處是 Breunig 所說三倍的 bug 和支援範圍。如果驗證成本下降、品質提升,為每個平台直接產生原生應用程式,也可能行得通。

我們也在嘗試自己的 GPU UI,差異是把大量 Web 開發的 DX 帶進來:類似 JSX 的元件、類似 CSS 的樣式、flexbox 排版、響應式狀態、像瀏覽器一樣的 DevTools,最後編譯成原生程式碼。它還在早期。

哪種答案會勝出,我們不知道,也可能幾種長期並存。開頭那三件事,直到今天都沒變。那個 PR 還關著,MyGo 還在成長,Claude 的桌面版仍是 Electron。這是個很有意思的時代。

05實驗報告

測試於 2026 年 11 月 4 日至 6 日進行。同一份場景在每個框架上各實作一遍,採用官方建議寫法、預設設定和 Release 建置。Compose 的設計頁和共用這套實作的靜止場景在修正模糊後重新測量。

表 3測試環境。兩台電腦的硬體、視窗和記憶體計算方式都不同,因此只比較同平台結果,不跨平台比較絕對值。
項目MacWindows
電腦Apple M4 Max,16 核心,64 GBThinkPad T14 Gen6,Core Ultra 7 255H,Arc 140T 內顯,32 GB
系統macOS 26.4Windows 11 Pro 10.0.26300
顯示Studio Display,60Hz,2x2880×1800,120Hz,200%
視窗1440×900 邏輯像素1280×720 邏輯像素,設計頁為 1440×900 無邊框
記憶體指標phys_footprintprivate commit(已認可的私有記憶體,不等於實體用量)
影格指標應用程式回呼,各框架定義不同,不用來比較PresentMon 2.6.0 顯示間隔,外部測量
電腦狀態非閒置,測試時有其他開發工作沒有其他使用者操作
表 4受測框架與版本。渲染路徑來自執行時期紀錄或框架 API 的實際回傳值;「未驗證」表示本次未取得執行時期證據。
框架版本Mac 渲染路徑Windows 渲染路徑
SwiftUI / WPFmacOS 26.4 SDK / .NET Framework 4.8.1系統合成WPF 預設 D3D9 管線
Electron45.2.2未驗證Chromium,ANGLE D3D11
Tauri2.12.5WKWebViewWebView2 156,ANGLE D3D11
GPUIZed c4273271Metal,預設設定未驗證
MyGo86ec3b30未驗證未驗證
eguieframe 0.37.0MetalVulkan
iced0.14.0MetalVulkan
Slint1.18.1FemtoVG,OpenGLFemtoVG,OpenGL ES
Flutter3.47.9Impeller,MetalImpeller,ANGLE D3D11
Compose1.12.2Skiko,MetalSkiko,D3D12
表 5測試情境。由應用程式內的計時器驅動,不需人工操作,測試資料使用固定種子產生。
情境工作內容
靜止顯示設計頁後保持不動,測量閒置成本
列表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% 以內。列表和動效是在統一規格後重測的,因此不同欄位並非在同一時段採集。CPU 以一個邏輯核心為 100%。多行程應用程式計入所有子行程,Mac 的 Tauri 也計入系統為它啟動的 WebKit 行程。Windows 的影格資料只採用能唯一歸屬至一個 swapchain、且沒有遺失紀錄的輪次。

串流和編輯都核對了實際完成量:Windows 上 Flutter 的編輯只完成 68%,其餘都在 99% 以上。

表 6Windows CPU,單位 %。
框架靜止列表串流編輯動態效果
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
表 7Windows 記憶體,private commit,單位 MiB。
框架靜止列表串流編輯動態效果
WPF1571932502062,425
Electron280397392556947
Tauri260313346536913
GPUI135142160138142
MyGo132135133132115
egui379386396460388
iced212224274321215
Slint79877220261
Flutter6363963746674,934
Compose4215445743,3722,422
表 8Windows 顯示間隔,單位 ms,120Hz 下 8.33 即滿影格率。輪數指具有有效影格資料的輪數。
框架列表 p95列表 p99輪數動效 p95動效 p99輪數
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
表 9Mac CPU,單位 %。電腦非閒置。
框架靜止列表串流編輯動態效果
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
表 10Mac 記憶體,phys_footprint,單位 MiB。
框架靜止列表串流編輯動態效果
SwiftUI324013629337
Electron205536567707698
Tauri101753601570555
GPUI74341358320335
MyGo75368361356371
egui414803817862839
iced75489541598491
Slint151423386434416
Flutter156468455663994
Compose3507107091,4261,295
表 11啟動是從啟動行程到首次影格回呼(ms),不是冷快取下的首次畫面。體積是散布目錄(MB),不含系統 WebView 和 .NET。
框架Mac 啟動Windows 啟動Mac 體積Windows 體積
原生(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

設計還原

背景模糊一項要柔化視窗內指定面板的彩條。Compose 1.12.2 為彩條圖層加上 24 dp 的 Modifier.blur 後,Mac 和 Windows 的原生視窗截圖都出現了柔和的過渡。SwiftUI 的實作同樣先模糊已知的彩條圖層,再疊加半透明白色。兩種寫法的驗證範圍都限於這層已知內容。 Compose Desktop API

十個框架的彩條面板對照。Compose、SwiftUI、Electron、Tauri、MyGo 和 Flutter 的條紋過渡柔和,其餘四個仍有清楚的色帶邊緣。
圖 2Mac 原生 2× 視窗截圖,裁切同一塊彩條面板並等比例縮小。

GPUI、iced、egui 和 Slint 的受測實作只在彩條上疊了半透明圖層,複測中仍可看到清楚的色帶邊緣。GPUI 的 Blurred 和 iced 的 window::Settings::blur 作用於視窗背後的內容。受測版本的內建繪製介面中未找到局部背景模糊。iced 可用自訂繪製實作局部效果,egui 可透過 PaintCallback 接入渲染後端。 GPUI · iced 視窗設定 · egui 繪製回呼

Slint 的受測組合為 1.18.1 與 FemtoVG,該版本未提供元素的 backdrop-blur 屬性。後續上游已為 Skia 渲染器加入此屬性,本次截圖對應 1.18.1 的 FemtoVG 路徑。 Slint 上游紀錄

設計頁共 11 項。Mac 上 GPUI、egui、iced、Slint、Compose 的 P3 色塊在本次輸出中未還原。Windows 截圖沒有色彩設定檔,P3 不作判定,旗幟 emoji 在各家都顯示成字母。

表 12關鍵模組的技術選擇,依據各框架固定版本的原始碼與官方文件。
框架排版文字無障礙
GPUITaffymacOS 使用 CoreTextAccessKit
egui即時模式排版epaint + harfrustAccessKit
iced自有 flex 排版cosmic-text未找到系統橋接
Slint編譯期降階 + 執行時期排版ParleyAccessKit
FlutterRenderBox 約束SkParagraphSemantics 樹橋接
ComposeMeasurePolicySkiko 的 SkParagraphSemantics,Windows 依賴 Java Access Bridge
ElectronBlinkChromium 文字管線Chromium 無障礙樹
Tauri系統 WebView系統 WebView透過 WebView 提供
SwiftUIStack / LayoutTextKit,Core Text系統內建

排版逐漸趨同,分歧最大的是文字。iced 在 macOS 上要求 PingFang 700 時,拉丁字母回退到了 Menlo Bold。

限制:

  • 每個平台只有一台電腦,動效結果來自 Intel 內顯,不一定適用於獨立顯示卡。
  • Mac 測試時電腦非閒置,影格資料只有應用程式回呼,不做跨框架比較。
  • 各家陰影的 blur 定義不同,egui、iced、GPUI 採近似實作;編輯控制項也不等價,GPUI 使用改寫的範例編輯器。
  • CPU 和記憶體表只統計應用程式及納入的輔助程序,未按視窗分攤 WindowServer 和驅動成本;系統共享資源的複用收益也未量化,不能用這些表為整機渲染成本排名。
  • 未能從輸入法候選字視窗、Mac 無障礙樹與耗電量測得有效結果。
U

ui.surf 編輯部

ui.surf 編輯部 · 1 篇