什麼是 Impeller?

#

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

有關 Impeller 的影片介紹,請觀看 Google I/O 2023 的以下演講。

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

Impeller 的目標如下:

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

可用性

#

您可以在何處使用 Impeller?有關詳細資訊,請參閱 Impeller 可用性? 頁面。

iOS

#

Flutter 3.29 起,Impeller 已成為iOS 上的預設設定,無法切換到 Skia。

Android

#

Impeller在 Android API 29+ 上可用且預設啟用。在執行較低版本 Android 或不支援 Vulkan 的裝置上,Impeller 會回退到舊版 OpenGL 渲染器。此回退行為無需您採取任何操作。

  • 要在除錯時停用 Impeller,請將 --no-enable-impeller 引數傳遞給 flutter run 命令。

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

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

Web

#

Flutter 網頁版提供兩種渲染器——canvaskitskwasm——它們目前都使用 Skia。未來它們可能會使用 Impeller。

macOS

#

您可以透過一個標誌來嘗試 macOS 上的 Impeller。在未來的版本中,將移除退出使用 Impeller 的功能。

要在除錯時在 macOS 上啟用 Impeller,請將 --enable-impeller 引數傳遞給 flutter run 命令。

flutter run --enable-impeller

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

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

Bug 和問題

#

團隊將繼續改進 Impeller 的支援。如果您在任何平臺上遇到 Impeller 的效能或保真度問題,請在 GitHub 問題跟蹤器上提交問題。在問題標題前加上 [Impeller],幷包含一個小的可重現的測試用例。

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

  • 您正在執行的裝置,包括晶片資訊。
  • 任何可見問題的螢幕截圖或錄影。
  • 效能跟蹤的匯出檔案。將檔案壓縮並附加到 GitHub 問題中。

架構

#

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

其他資訊

#