Impeller 渲染引擎
什麼是 Impeller 以及如何啟用它?
什麼是 Impeller?
#Impeller 為 Flutter 提供了一個全新的渲染執行時。Impeller 在引擎構建時預編譯了一套更小、更簡單的著色器,從而避免了在執行時進行編譯。
若想觀看 Impeller 的影片介紹,請檢視以下來自 Google I/O 2023 的演講。
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>標籤下新增以下設定:
<meta-data
android:name="io.flutter.embedding.android.EnableImpeller"
android:value="false" />
Web
#Flutter Web 提供兩種渲染器 —— canvaskit 和 skwasm,它們目前都使用 Skia。未來它們可能會使用 Impeller。
macOS
#您可以嘗試透過標誌啟用 macOS 版 Impeller。在未來的版本中,選擇停用 Impeller 的功能將被移除。
若要在除錯時啟用 macOS 版 Impeller,請在 flutter run 命令中傳入 --enable-impeller 引數。
flutter run --enable-impeller
若要在部署應用時啟用 macOS 版 Impeller,請在應用的 Info.plist 檔案中的頂級 <dict> 標籤下新增以下標籤:
<key>FLTEnableImpeller</key>
<true />
Bug 與問題
#團隊正在持續改進 Impeller 的支援。如果您在使用 Impeller 時遇到任何平臺的效能或保真度問題,請在 GitHub 問題追蹤器 中提交 issue。請在 issue 標題前加上 [Impeller] 字首,幷包含一個簡單的可復現測試案例。
提交 Impeller 相關問題時,請包含以下資訊:
- 您執行應用的裝置資訊,包括晶片資訊。
- 任何可見問題的截圖或錄屏。
- 一份效能跟蹤匯出的檔案。請將檔案壓縮並附加到 GitHub issue 中。
架構
#若想了解有關 Impeller 設計和架構的更多詳情,請檢視原始碼樹中的 README.md 檔案。