Flutter 中 Camera 與背景執行的那些事

在 Flutter 裡用 camera,看似簡單,其實是個多層次的世界。

要讓影像處理順暢不卡,非得搞清楚幾件事。

一、await 不等於背景執行

await 只是語法糖,讓非同步程式看起來「像同步」。

但它仍在主執行緒裡運行,只是暫時讓出控制權。

如果背後的工作太重,畫面還是會頓。

二、Isolate、compute、spawn 的差別

Flutter 沒有真正的多執行緒。

要在背景處理資料,得靠 Isolate

  • compute()
    • Flutter 內建的簡易背景工具。
    • 適合「一次性任務」,例如單張影像轉換。 任務結束後自動銷毀。
  • Isolate.spawn()
    • 可以建立「長駐的背景執行緒」。
    • 用 SendPort、ReceivePort 跟主程式保持溝通。
    • 適合連續性任務,例如影像串流、推論、錄影壓縮。

簡單說:

await 是語法糖,

compute 是臨時工,

spawn 才是常駐員。

三、Channel 與 FFI 的界線

Flutter 與原生世界溝通有兩種方式:

  • Platform Channel
    • Flutter ↔ Android / iOS 的橋樑。
    • 執行於主執行緒。
    • 適合拍照、權限、系統呼叫等操作。
  • FFI(Foreign Function Interface)
  • 直接呼叫原生 C/C++ 函式庫。
  • 可在背景 Isolate 執行。
  • 適合高運算任務:影像處理、AI 推論、FFT、加密等。

一句話:

Channel 負責「通話」,

FFI 負責「運算」。

四、assets 只能在主執行緒載入

rootBundle.load()、AssetImage 都屬於 Flutter engine 綁定資源。

背景 Isolate 無法直接操作。

正確方式:

在主執行緒載入檔案。 轉成 Uint8List。 傳進背景執行緒處理。

五、真正的背景執行要靠 FFI

背景 Isolate 無法使用 Channel、也不能載入 assets。

若要做長時間、重運算的工作,

FFI 是唯一穩定的方式。

這樣才能完全脫離主執行緒,不影響畫面。

六、結語

Flutter 的非同步世界其實很單純。

async / await 是流程控制,

Isolate 是平行運算,

Channel 是橋樑,

FFI 才能真正「分身」。

理解這幾層,Camera 的畫面就能穩、背景的運算也能快。

真正流暢的 Flutter,就從這裡開始。

留言

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.