跳到主內容

Impeller 渲染引擎

什麼是 Impeller 以及如何啟用它?

什麼是 Impeller?

#

Impeller 為 Flutter 提供了一個全新的渲染執行時。Impeller 在引擎構建時預編譯了一套更小、更簡單的著色器,從而避免了在執行時進行編譯。

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

在 YouTube 新標籤頁中觀看:“Introducing Impeller, Flutter's new rendering engine”(介紹 Flutter 的新渲染引擎 Impeller)

Impeller 的目標如下:

  • 可預測的效能:Impeller 在構建時離線編譯所有著色器和反射。它會預先構建所有管線狀態物件,並由引擎顯式控制快取。
  • 可檢測性:Impeller 會標記和標註所有圖形資源(如紋理和緩衝區)。它可以在不影響單幀渲染效能的情況下,捕獲動畫並將其持久化到磁碟。
  • 可移植性:Flutter 不會將 Impeller 繫結到特定的客戶端渲染 API。您可以編寫一次著色器,並根據需要將其轉換為特定後端的格式。
  • 利用現代圖形 API:Impeller 使用(但不依賴於)Metal 和 Vulkan 等現代 API 中可用的特性。
  • 利用併發性:如有必要,Impeller 可以將單幀工作負載分配到多個執行緒中執行。

可用性

#

您可以在哪裡使用 Impeller?如需詳細資訊,請檢視 我可以使用 Impeller 嗎? 頁面。

iOS

#

在 iOS 上,Impeller 是唯一支援的渲染引擎,無法切換回 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 提供兩種渲染器 —— canvaskitskwasm,它們目前都使用 Skia。未來它們可能會使用 Impeller。

macOS

#

您可以嘗試透過標誌啟用 macOS 版 Impeller。在未來的版本中,選擇停用 Impeller 的功能將被移除。

若要在除錯時啟用 macOS 版 Impeller,請在 flutter run 命令中傳入 --enable-impeller 引數。

flutter run --enable-impeller

若要在部署應用時啟用 macOS 版 Impeller,請在應用的 Info.plist 檔案中的頂級 <dict> 標籤下新增以下標籤:

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

Bug 與問題

#

團隊正在持續改進 Impeller 的支援。如果您在使用 Impeller 時遇到任何平臺的效能或保真度問題,請在 GitHub 問題追蹤器 中提交 issue。請在 issue 標題前加上 [Impeller] 字首,幷包含一個簡單的可復現測試案例。

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

  • 您執行應用的裝置資訊,包括晶片資訊。
  • 任何可見問題的截圖或錄屏。
  • 一份效能跟蹤匯出的檔案。請將檔案壓縮並附加到 GitHub issue 中。

架構

#

若想了解有關 Impeller 設計和架構的更多詳情,請檢視原始碼樹中的 README.md 檔案。

更多資訊

#