什麼是 Impeller?

#

Impeller 為 Flutter 提供了一個全新的繪圖執行時引擎。
Impeller 會在引擎建置階段預先編譯一組更小且更簡單的著色器 (shaders), 因此這些著色器不會在執行階段編譯。

若想觀看 Impeller 的影片介紹,請參考以下來自 Google I/O 2023 的演講。

Watch on YouTube in a new tab: "Introducing Impeller, Flutter's new rendering engine"

Impeller 的設計目標如下:

  • 可預測的效能
    Impeller 會在建置階段離線編譯所有著色器與反射,並預先建立所有管線狀態物件。
    引擎會主動控制快取並明確地進行快取管理。
  • 可監控性(Instrumentable)
    Impeller 會為所有圖形資源(如紋理與緩衝區)加上標籤與標記。
    它可以擷取動畫並將其儲存到磁碟,且不會影響每幀繪製效能。
  • 可攜性(Portable)
    Flutter 並未將 Impeller 綁定於特定的客戶端繪圖 API。
    您可以只撰寫一次著色器,必要時再轉換為後端專屬格式。
  • 善用現代圖形 API
    Impeller 利用(但不依賴)現代 API(如 Metal 與 Vulkan)所提供的功能。
  • 善用並行處理
    Impeller 可視需要將單一幀的工作負載分配至多個執行緒。

支援狀態

#

Impeller 可以在哪裡使用?如需_詳細_資訊,請參考 Can I use Impeller? 頁面。

iOS

#

Flutter 3.29 起,Impeller 已成為 iOS 的預設引擎,且無法切換回 Skia。

Android

#

Impeller 在 Android API 29+ 預設啟用且可用
在執行較舊版本 Android 或不支援 Vulkan 的裝置上,Impeller 會自動回退至傳統的 OpenGL 繪圖引擎。
這種回退行為無需您額外操作。

  • 若在除錯時想_停用_ Impeller,請在 flutter run 指令中傳入 --no-enable-impeller

    flutter run --no-enable-impeller
  • 若要在部署應用程式時停用 Impeller, 請在專案的 AndroidManifest.xml 檔案中的 <application> 標籤下加入以下設定:

xml
<meta-data
    android:name="io.flutter.embedding.android.EnableImpeller"
    android:value="false" />

Web

#

Flutter 在 Web 上提供了[兩種渲染器][two renderers] ——canvaskitskwasm——目前這兩種渲染器皆使用 Skia。未來它們有可能會改用 Impeller。 [two renderers]: /platform-integration/web/renderers#renderers

macOS

#

你可以在 macOS 上透過啟用旗標(flag)來試用 Impeller。在未來的版本中,將會移除選擇不使用 Impeller 的能力。

若要在 macOS 偵錯時啟用 Impeller,請在 flutter run 指令中加入 --enable-impeller 參數。

flutter run --enable-impeller

若要在 macOS 部署應用程式時啟用 Impeller,請在應用程式的 Info.plist 檔案中,於最上層的 <dict> 標籤下新增以下標籤。

xml
  <key>FLTEnableImpeller</key>
  <true />

錯誤與問題回報

#

團隊持續改進 Impeller 的支援。 如果你在任何平台上遇到 Impeller 的效能或畫面品質問題, 請在 GitHub tracker 上提交問題。 請在問題標題前加上 [Impeller], 並附上一個可重現的小型測試案例。

提交 Impeller 問題時,請包含以下資訊:

  • 你所使用的裝置,包括晶片相關資訊。
  • 任何可見問題的螢幕截圖或錄影。
  • 效能追蹤檔案的匯出。 請將檔案壓縮後,附加於 GitHub 問題中。

架構

#

若想進一步了解 Impeller 的設計與架構, 請參閱原始碼樹中的 README.md 檔案。

其他資訊

#