Impeller rendering engine
What is Impeller?
Impeller provides a new rendering runtime for Flutter. The Flutter team’s believes this solves Flutter’s early-onset jank issue. Impeller precompiles a smaller, simpler set of shaders at Engine build time so they don’t compile at runtime.
For a video introduction to Impeller, check out the following talk from the Flutter Foward 2023 conference.
Impeller has the following objectives:
- Predictable performance: Impeller compiles all shaders and reflection offline at build time. It builds all pipeline state objects upfront. The engine controls caching and caches explicitly.
- Instrumentable: Impeller tags and labels all graphics resources like textures, and buffers. It can capture and persist animations to disk without affecting per-frame rendering performance.
- Portable: Flutter doesn’t tie Impeller to a specific client rendering API. You can author shaders once and convert them to backend-specific formats as necessary.
- Leverages modern graphics APIs: Impeller uses, but doesn’t depend on, features available in modern APIs like Metal and Vulkan.
- Leverages concurrency: Impeller can distribute single-frame workloads across multiple threads if necessary.
Availability
Where can you use Impeller?
iOS
Flutter enables Impeller by default on iOS.
-
To disable Impeller on iOS when debugging, pass
--no-enable-impeller
to theflutter run
command.$ flutter run --no-enable-impeller
-
To disable Impeller on iOS when deploying your app, add the following tags under the top-level
<dict>
tag in your app’sInfo.plist
file.<key>FLTEnableImpeller</key> <false />
The team continues to improve iOS support.
If you encounter performance or fidelity issues
with Impeller on iOS, file an issue in the GitHub tracker.
Prefix the issue title with [Impeller]
and
include a small reproducible test case.
Android
Android development continues but it’s not ready for preview.
Impeller on Android might not work on the master
channel.
To see what direction Android support will take,
experiment with Impeller in the 3.7 or later stable release.
To enable Impeller on Android, take one of the following actions:
-
Pass
--enable-impeller
to theflutter run
command.$ flutter run --enable-impeller
-
Add the following tag to your
AndroidManifest.xml
file under the<application>
tag.<meta-data android:name="io.flutter.embedding.android.EnableImpeller" android:value="true" />
Architecture
To learn more details about Impeller’s design and architecture, check out the README.md file in the source tree.
Additional Information
- Frequently asked questions
- Impeller’s coordinate system
- How to set up Xcode for GPU frame captures with metal
- Learning to read GPU frame captures
- How to enable metal validation for command line apps
- How Impeller works around the lack of uniform buffers in Open GL ES 2.0
- Guidance for writing efficient shaders
- How color blending works in Impeller