Repository navigation
Description
Related to #192364, but a different GPU vendor and — importantly — the OpenGLES backend rather than Vulkan, so the "poorly implemented Vulkan driver" hypothesis raised there does not cover this case. @gaaclarke asked on that issue whether the regression reproduces on another device; this is that data point.
Steps to reproduce
- Build a release APK of a portrait phone app whose main screen is a scrolling column of translucent cards over a full-screen background. The background is four stacked full-screen layers: a linear gradient, a JPEG (~900×1350,
BoxFit.cover), a flat scrimContainer, and a second linear gradient. NoBackdropFilter, no blur, noShaderMask, no custom shaders. The cards are alpha fill, not blur. - Install on an Infinix X6532C (MediaTek MT6765, PowerVR Rogue GE8320, OpenGL ES 3.2, Android 14, armeabi-v7a, 720×1600 running its 60 Hz mode).
- Drive an identical scripted scroll so the input is the same at every build:
for i in $(seq 1 12); do
adb shell input swipe 360 1250 360 450 220
adb shell input swipe 360 450 360 1250 220
done
- Collect frame timings in-app from
SchedulerBinding.instance.addTimingsCallback, counting a frame late whenFrameTiming.totalSpanexceeds 16.667 ms, and separately counting frames whosebuildDurationorrasterDurationalone exceeds it. - Add the opt-out to
AndroidManifest.xml, rebuild, and run the same script again:
<meta-data
android:name="io.flutter.embedding.android.EnableImpeller"
android:value="false" />Expected results
Impeller performs at least as well as Skia, so that removing the opt-out — which is deprecated, and which the engine warns about on every launch — is safe.
Actual results
Under Impeller, every single frame of a scroll is late, and it is raster-bound. Same APK contents, same device, same scripted scroll, three consecutive runs alternating the renderer:
| Renderer | frames | late (totalSpan > 16.667 ms) |
buildDuration over budget |
rasterDuration over budget |
|---|---|---|---|---|
| Impeller (OpenGLES) | 400 | 400 (100%) | 4 | 393 |
| Skia | 1000 | 64 (6.4%) | 2 | 9 |
| Impeller (OpenGLES), again | 400 | 400 (100%) | 4 | 393 |
Mean frame span under Impeller was 32.8 ms — about 30 fps on a 60 Hz panel — against a smooth result on Skia from identical Dart code.
Mean buildDuration was 1.5 ms in every run, on both renderers, so the framework side and the widget tree are not involved. The entire difference is raster.
The engine selects the GLES backend on this device on its own; this is not a forced configuration. Relevant log line:
[IMPORTANT:flutter/shell/platform/android/android_context_gl_impeller.cc(104)] Using the Impeller rendering backend (OpenGLES).
Notes
- This is a release build. Unlike
[Impeller] Impeller is significantly slower than Skia on Adreno 702 (QCM2290) — 3.5x worse raster, Flutter 3.47.2#192364, no profile-mode comparison is offered, because the Impeller profile-mode engine artifacts could not be fetched here; everything above is release-to-release. - Wrapping the static four-layer background in a
RepaintBoundarymoved mean raster only from 21.7 ms to 20.6 ms — inside the noise between sessions. So the cost does not appear to be re-rasterising a cacheable background, and I could not find an application-side mitigation that recovered the frame rate. Disabling Impeller was the only thing that worked. - PowerVR Rogue GE8320 on MT6765 is a very common low-end Android part, and GLES-only devices are the floor of the Android market. Together with
[Impeller] Impeller is significantly slower than Skia on Adreno 702 (QCM2290) — 3.5x worse raster, Flutter 3.47.2#192364 (Adreno 702, Vulkan), that is two different GPU vendors and two different backends showing Impeller materially slower than Skia on low-end hardware, which argues against ane: device-specificreading. - The practical concern is the deprecation: when the opt-out is removed, an app in this position has no mitigation left in its own hands.
Flutter Doctor output
Flutter 3.47.1 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 6655482ec0 • 2026-08-19
Engine • hash 11d79658c444477b06513d32b52c8c4ccb7276b0 (revision 5d53178869) • 2026-08-18
Tools • Dart 3.13.1 • DevTools 2.60.0
Device, for completeness:
ro.product.model Infinix X6532C
ro.build.version.release 14
ro.product.cpu.abi armeabi-v7a
ro.hardware mt6765
SurfaceFlinger GLES Imagination Technologies, PowerVR Rogue GE8320,
OpenGL ES 3.2 build 1.15@6070602
Activity
gaaclarke commentedon Sep 18, 2026
Thanks @codewithsuperior, can you please provide a minimal reproduction. Any one of those elements that you list may be the one thing that is misbehaving. By trimming it down to a minimal reproduction we can get a better idea of what could be going wrong.
github-actions commentedon Oct 9, 2026
Without additional information, we are unfortunately not sure how to resolve this issue. We are therefore reluctantly going to close this bug for now.
If you find this problem please file a new issue with the same description, what happens, logs and the output of 'flutter doctor -v'. All system setups can be slightly different so it's always better to open new issues and reference the related ones.
Thanks for your contribution.
github-actions commentedon Oct 23, 2026
This thread has been automatically locked since there has not been any recent activity after it was closed. If you are still experiencing a similar issue, please open a new bug, including the output of
flutter doctor -vand a minimal reproduction of the issue.