跳到主内容

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 文件。

更多信息

#