Tag: Camera

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

    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,就從這裡開始。