什么是 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 文件。

其他信息

#