當 Flutter 撞上 3D 的那道牆 - Fluorite
Toyota 如何用 Flutter + C++ 打造 Console 級遊戲引擎
先看看效果
Toyota 目前已經把 Flutter 成功跑在量產車上了——2026 RAV4 的車載資訊娛樂系統,正是基於 Flutter embedded stack 打造。傳統 Flutter 只能做 2D 靜態介面,在車載場景這顯然不夠。
想像一下:你要做一個 3D 互動使用手冊,讓車主旋轉車體模型、點擊輪胎查看胎壓、拖動 Slider 調整懸吊高度。或者即時渲染車輛硬體狀態、環境地圖投影——這些全都需要一個遊戲引擎。
問題是,現有的遊戲引擎沒有一個能跟 Flutter embedded 好好整合。Toyota Connected 的解法?自己造一個。
我一開始看到這個演講的時候,想說大概是一個「某公司內部工具順便開源」的故事。但看完之後發現,他們要處理的問題複雜得多——而且這個問題不只 Toyota 有。
1. 為什麼現有遊戲引擎不行?
Toyota 團隊不是沒試過。他們實際測了市面上每個主流方案,結論是:全部不合格。
先看閉源陣營。Unity 和 Unreal 需要隨 Linux 發行版出貨 proprietary blobs——這直接讓你失去 Yocto 相容性。嵌入式 Linux 的世界裡,Yocto 是標準建構系統,你沒辦法繞過去。更糟的是,每個 native view 都要啟動一整個引擎實例,frame rate 慘不忍睹。加上一年動輒數百萬美元的授權費,對車廠來說這筆帳算不過來。
那開源的 Godot 呢?授權沒問題了,但在 Raspberry Pi 5 上光是啟動就要等超過 20 秒。車主坐進車裡、發動引擎、螢幕亮了——然後要等 20 秒才能看到 3D 介面?這不是使用者體驗,這是考驗耐心。
最後是 Flutter GPU(Impeller)。理論上最完美——原生 Flutter 整合、Dart 語言、Hot Reload 全都有。但現實是:iOS 穩定、Android 不穩、Linux / macOS / Windows 根本不能用。對一個跑在嵌入式 Linux 上的車載系統來說,這等於不存在。
Toyota 試完一輪之後的結論很明確:
沒有一個方案能同時滿足 Flutter 整合 + 嵌入式支援 + 高效能 3D + 開源授權。
所以他們決定自己造一個。
這件事其實反映了 Flutter 生態一個更深層的狀態:Flutter 在 2D UI 的世界裡已經贏了,但一碰到需要底層圖形能力的場景,你會發現腳下是空的。不只是 3D 遊戲——AR 濾鏡、點雲視覺化、甚至稍微進階一點的 shader 效果,Flutter 開發者都得靠 platform channel 把活丟回原生端。Fluorite 要解決的不只是 Toyota 一家公司的問題,而是整個生態在「圖形能力」這個維度上的缺口。
2. Fluorite 是什麼?
想像你在蓋一棟房子。Flutter 是你的室內設計師——按鈕、清單、動畫、頁面切換,所有 2D 的東西它都搞得定。但現在你想在客廳裝一面互動式 3D 螢幕牆。你不會把整棟房子拆掉重蓋,你會找一個能嵌進現有結構的模組。
Fluorite(螢石) 就是那個模組。
它是 Toyota Connected 開發的開源 3D 遊戲引擎,以 Flutter package 的形式直接整合進你的 App。不需要額外的 runtime、不需要 platform view hack、不需要學新語言。pubspec.yaml 加一行,你就有了一個 3D 引擎。
簡單說就是——FluoriteView 是一個 Widget。
這個設計方向是對的。Flutter 開發者對 Widget 的直覺是「輕量、可組合、放哪裡都行」,Fluorite 刻意維持了這個心智模型,而不是丟給你一個需要特殊處理的外來物。它遵循 Flutter 的 layout system,可以放在任何位置:Column 裡、Stack 上、TabView 的某個 tab。你甚至可以在同一個畫面放多個 FluoriteView,每個顯示不同的 3D 視角。
更關鍵的是,3D 遊戲物件和 Flutter UI widgets 可以透過 Provider / Riverpod / Bloc 即時互動——你熟悉的 state management 方案,全都直接能用。
3. 技術架構
Fluorite 不是從零造輪子。它站在三個成熟技術的肩膀上,就像一個三明治——上層是你摸得到的 Dart API,中間是負責效能的 C++ 核心,底層是兩個久經考驗的開源引擎。
最上層是 Dart API。開發者只跟這層打交道——建立 Entity、掛 Component、寫行為腳本,全都是 Dart。
中間是 C++ ECS 核心。為什麼不直接用 Dart 寫?因為嵌入式裝置的記憶體和 CPU 資源有限,C++ 讓團隊能精確控制記憶體配置與處理流程,在 Raspberry Pi 這種低階硬體上榨出最佳效能。
底層有兩個支柱:
Google Filament 負責 3D 渲染——這是同一個驅動 Android 系統 UI 的引擎,完全 GPU 加速,走 Vulkan 1.1+,支援 PBR(真實光影)、HDR 光照、還有基於 GLSL 超集的自訂 Shader Pipeline
SDL3 負責跨平台 I/O——統一處理不同嵌入式裝置的輸入輸出和視窗管理
一句話總結架構:Dart 寫邏輯、C++ 跑效能、Filament 畫畫面、SDL3 管平台。
4. ECS——你已經會了,只是不知道
如果你在 Unity 裡掛過 Transform component,恭喜,你已經用過 Entity Component System(ECS) 了。
ECS 是遊戲引擎最主流的架構模式。把它想成樂高:Entity 是一塊空白底板,本身什麼都不是;Component 是你往上面插的積木塊——位置、碰撞體、3D 模型、行為腳本;System 是遊戲每一幀去掃描所有 Entity、找出有特定 Component 組合的那些、然後執行邏輯。
Fluorite 的 API 幾乎是同一套邏輯——差別只在語言從 C# 變成 Dart:
// 一個彈跳球 — 看起來跟 Unity 的 GameObject 幾乎一樣
final bouncingBall = Entity(
name: 'BouncingBall',
components: [
Transform(
position: Vector3(0, 5, 0), // 起始位置:空中 5 公尺
scale: Vector3(1, 1, 1),
rotation: Quaternion.identity(),
),
SphereCollider(radius: 0.5), // 碰撞範圍
ModelRenderable(asset: 'assets/ball.glb'), // 3D 模型
BehaviorScript(
onCreate: (entity) { /* 初始化邏輯 */ },
onUpdateFrame: (entity, deltaTime) {
// 每幀更新:重力、彈跳、位移
},
),
],
);
Transform、Collider、Renderable、Behavior Script——如果你從 Unity、Unreal 或 Godot 過來,這些概念你閉著眼睛都認得出來。
Fluorite 也提供階層式場景圖(Hierarchical Scene Graph),讓你建構複雜的巢狀物件結構。車體是父 Entity,四個輪子是子 Entity,每個輪子上再掛胎壓感測器——跟你在其他遊戲引擎裡做的一模一樣。
遷移成本幾乎為零:如果你會用 Unity 做場景,你就會用 Fluorite。
不過話說回來,「遷移成本低」這句話主要是對有遊戲開發背景的人說的。如果你是純 Flutter 開發者,從來沒碰過遊戲引擎,ECS 的思維方式跟你平常寫 Widget tree 是不一樣的——Widget 是宣告式的 UI 描述,ECS 是每幀跑一次的 system loop。這中間有一段學習曲線。好消息是,Fluorite 把 ECS 包在 Dart API 裡,你不需要理解底層的 system scheduling,只要會掛 Component 就能開始做東西。但如果你想做比 demo 更複雜的場景,理解 ECS 的資料流還是必要的。
5. 美術跟開發怎麼協作?
傳統遊戲開發有一個痛點:美術把 3D 模型做好交給開發,開發要花大量時間在模型上「圈」出互動區域、設定碰撞邊界、綁定事件。美術改一版模型,開發就要重新圈一次。
Fluorite 用了一個巧妙的設計來解決這個問題:Model-Defined Touch Trigger Zones。
概念很簡單——讓 3D 美術師直接在 Blender 裡用命名規則標記模型上的互動區域。比如一個車體模型,美術在四個輪胎上各標一個 trigger_tire_FL、trigger_tire_FR⋯⋯。開發者這邊只要寫:「收到 trigger_tire_FL 的點擊事件,就打開胎壓調整面板。」
實際效果:
點擊 3D 車模的輪胎 → 調整胎壓數值
拖動 Flutter Slider → 即時更新 3D 模型上的胎壓指示器
遊戲狀態和 Flutter UI 完全同步
這個設計最大的好處是:美術和開發可以完全平行工作。美術在 Blender 裡調模型的同時,開發在 Dart 裡寫互動邏輯,雙方透過 GLTF/GLB 格式交接,不需要等對方。
6. Dart-First 開發體驗
Fluorite 跟其他方案最大的差異就一句話:你用 Dart 寫遊戲邏輯,用 Flutter 寫 UI,兩者在同一個專案裡。
這代表什麼?
單一語言 — UI 和遊戲邏輯都是 Dart,不用在 C# 和 Dart 之間切換上下文。共享程式碼 — state management、model class、utility function 全部共用,不需要維護兩套。完整工具鏈 — Hot Reload、Widget Inspector、DevTools 全都能用。改一下相機軌道距離的數值、按存檔,不到一秒就能看到 3D 場景更新——相比其他遊戲引擎動輒數十秒的重新編譯,這是數量級的速度差距。pub.dev 生態 — 現有的數千個 package 直接可用,不用重造輪子。
來看看跟其他方案的對比:
Fluorite 是目前唯一一個在所有維度都打勾的方案。
7. 冷靜看 Fluorite:風險在哪?
技術上 Fluorite 很有說服力,但在之後決定投入之前,需要思考一下。
單一公司依賴。 Fluorite 目前的開發主力是 Toyota Connected,社群貢獻者還很少。如果 Toyota 內部優先級調整、或者團隊重組,這個專案的維護節奏會直接受影響。對比 Godot 背後有上千名貢獻者和獨立基金會,Fluorite 的 bus factor 明顯偏低。
Impeller 的陰影。 Flutter 官方的 Impeller 渲染引擎還在積極開發中。假設兩年後 Impeller 補上了 Linux 和 desktop 的 3D 能力,Fluorite 的定位就會變得尷尬——你要用官方原生方案,還是第三方引擎?這不代表 Fluorite 會變得沒用(它的 ECS 架構和嵌入式優化是 Impeller 不會做的),但開發者需要意識到這個潛在的重疊。
8. Roadmap 與資源格式
已完成
C++ ECS 核心引擎
Filament 3D 渲染整合
Dart API Layer
階層式場景圖
Model-defined touch trigger zones
Hot Reload 支援
PBR 材質 + HDR 光照
自訂 Shader Pipeline
進行中 / 規劃中
Jolt Physics 整合 — 剛體 / 軟體物理模擬,以 Component 形式掛載
CLI / GUI 工具 — 支援設計師和開發者的創作工作流
完整跨平台支援 — 嵌入式 Linux(含 Yocto)、iOS、Android、macOS、Windows、遊戲主機
SDL3 Dart API — 以 package 形式開放 SDL3 能力給 Flutter 社群
資源格式
目前支援的資源格式:3D 模型走 GLTF / GLB(跟 Blender 完整相容)、貼圖支援 KTX、HDR 及其他常見格式、Shader 用 GLSL 超集。
如果你在 Unity / Unreal / Godot 有現成的 GLTF 資產,可以在幾分鐘內直接移植到 Fluorite。
9. 所以,這對 Flutter 開發者意味什麼?
Fluorite 表面上是一個 3D 遊戲引擎,但它背後代表的是一個更大的訊號:Flutter 正在從「UI toolkit」變成「application platform」。
回想一下 Flutter 的發展軌跡。最初它只能做手機 App,然後擴展到 Web、Desktop、嵌入式。每一次擴展,都有人說「Flutter 不適合做這個」,然後都有團隊用實際產品證明它可以。Fluorite 是這條路上的最新一步——Toyota 用它證明了 Flutter 甚至可以跑 console-grade 的 3D 渲染。
這不代表每個 Flutter 開發者明天都要去學 ECS。但它打開了一扇門:如果你的下一個專案需要 3D 產品展示、AR 互動、資料視覺化、甚至簡單的遊戲,你不再需要離開 Flutter 生態去找答案。
現在可以做的三件事:
關注 Fluorite 的開源進度。 到 fluorite.game 留意 repo 公開的時間點。一旦開放,跑一次範例專案,感受一下 Dart 寫 3D 是什麼體驗。就算最後不用,這個認知也值得建立。
追蹤 Impeller 的 desktop 進度。 如果你在意 3D 但不需要嵌入式,Impeller 可能是更輕量的選擇。兩邊都關注,等時機成熟再選邊站。
想想你手上的專案有沒有「被 2D 限制住」的地方。 產品頁面的 3D 模型展示、資料的空間視覺化、遊戲化的 onboarding 流程——這些以前要靠 WebView 或 platform channel 繞路的需求,現在有了原生選項。
Fluorite 目前還沒有公開 repo,但我已經在追蹤 fluorite.game 的動態了。等 repo 一開放,我會第一時間跑看看——有些東西光看演講判斷不出來,要自己寫過才知道。
Flutter 的 3D 故事才剛開始。Fluorite 不一定是最終答案,但它是目前唯一一個認真嘗試的。
資源
IVI Home Screen — Toyota 的 Flutter Embedder
Meta Flutter — Yocto Linux 上的 Flutter 解決方案
Google Filament — 3D 渲染引擎
SDL3 — 跨平台多媒體庫








