Software Engineering & Digital Products for Global Enterprises since 2006
CMMi Level 3SOC 2ISO 27001
Menu
View all services
Staff Augmentation
Embed senior engineers in your team within weeks.
Dedicated Teams
A ring-fenced squad with PM, leads, and engineers.
Build-Operate-Transfer
We hire, run, and transfer the team to you.
Contract-to-Hire
Try the talent. Convert when you're ready.
ForceHQ
Skill testing, interviews and ranking — powered by AI.
RoboRingo
Build, deploy and monitor voice agents without code.
MailGovern
Policy, retention and compliance for enterprise email.
Vishing
Test and train staff against AI-driven voice attacks.
CyberForceHQ
Continuous, adaptive security training for every team.
IDS Load Balancer
Built for Multi Instance InDesign Server, to distribute jobs.
AutoVAPT.ai
AI agent for continuous, automated vulnerability and penetration testing.
Salesforce + InDesign Connector
Bridge Salesforce data into InDesign to design print catalogues at scale.
View all solutions
Banking, Financial Services & Insurance
Cloud, digital and legacy modernisation across financial entities.
Healthcare
Clinical platforms, patient engagement, and connected medical devices.
Pharma & Life Sciences
Trial systems, regulatory data, and field-force enablement.
Professional Services & Education
Workflow automation, learning platforms, and consulting tooling.
Media & Entertainment
AI video processing, OTT platforms, and content workflows.
Technology & SaaS
Product engineering, integrations, and scale for tech companies.
Retail & eCommerce
Shopify, print catalogues, web-to-print, and order automation.
View all industries
Blog
Engineering notes, opinions, and field reports.
Case Studies
How clients shipped — outcomes, stack, lessons.
White Papers
Deep-dives on AI, talent models, and platforms.
Portfolio
Selected work across industries.
View all resources
About Us
Who we are, our story, and what drives us.
Co-Innovation
How we partner to build new products together.
Careers
Open roles and what it's like to work here.
News
Press, announcements, and industry updates.
Leadership
The people steering MetaDesign.
Locations
Gurugram, Brisbane, Detroit and beyond.
Contact Us
Talk to sales, hiring, or partnerships.
Request TalentStart a Project
Mobile Development

Impeller vs. Skia: Fix Rendering Glitches & Boost UI Performance

GS
Girish Sagar
Technical Content Lead
August 6, 2025
10 min read
Impeller vs. Skia: Fix Rendering Glitches & Boost UI Performance — Mobile Development | MetaDesign Solutions

Why Flutter's Rendering Engine Matters More Than You Think

The rendering engine is the invisible heart of every Flutter application. It takes your widget tree and transforms it into the actual pixels painted on the user's screen at 60 or 120 frames per second. For years, Skia—Google's open-source 2D graphics library—served as this engine. While mature and feature-rich, Skia's architecture created a notorious problem in Flutter apps: shader compilation jank, where the first occurrence of a complex animation would stutter and freeze as shaders were compiled at runtime. Impeller, Flutter's purpose-built replacement, was engineered from scratch to eliminate this problem entirely.

How Skia's Runtime Shader Compilation Causes Jank

Skia uses a just-in-time shader compilation model. When Flutter encounters a visual effect for the first time (a blur, a gradient, a complex clip path), Skia compiles the necessary GPU shader program at runtime. This compilation can take 50–200 milliseconds, causing visible frame drops and stutter—exactly when the user expects a smooth animation. Subsequent instances of the same effect are cached, so the jank only occurs on first encounter. Flutter attempted to mitigate this with `--bundle-sksl-path` for SkSL warm-up, but this required capturing shader traces on real devices and bundling them—a fragile, maintenance-heavy process.

Impeller's Ahead-of-Time Shader Compilation Architecture

Impeller takes a fundamentally different approach: all shaders are pre-compiled at build time. When you run `flutter build`, Impeller compiles every shader it will ever need into platform-specific GPU bytecode (Metal IR for iOS, SPIR-V/Vulkan for Android). At runtime, there is zero shader compilation—the GPU receives ready-to-execute instructions immediately. This architectural decision eliminates the entire category of first-frame jank. Impeller also replaces Skia's CPU-heavy tessellation with a GPU-first rendering pipeline that leverages hardware tessellation units directly.

Metal and Vulkan: Impeller's Native GPU Backends

Impeller is not a cross-platform abstraction layer sitting on top of OpenGL. It speaks directly to the platform's modern GPU API. On iOS, Impeller uses Metal—Apple's low-level GPU framework—for maximum performance on iPhones and iPads. On Android, Impeller uses Vulkan for devices that support it (most modern Android phones), falling back to OpenGL ES only on older hardware. This native backend approach means Impeller can take advantage of Metal's tile-based deferred rendering on iOS and Vulkan's explicit memory management on Android, achieving GPU utilization levels that Skia's OpenGL abstraction could never reach.

Real-World Performance Benchmarks: Skia vs. Impeller

The measurable difference is dramatic. In a fintech dashboard app with heavy chart rendering: Skia dropped 12% of frames during scroll, while Impeller dropped only 1.5%. In an AR travel app with camera overlays and complex compositing: Impeller achieved 3x faster animation load times on the Metal backend. Frame pacing—the consistency of frame delivery times—improved by over 40% on average. Perhaps most critically, the p99 (99th percentile) frame time, which represents worst-case stutter, dropped from 32ms on Skia to under 8ms on Impeller, ensuring that even the most complex UI transitions remain within the 16.6ms budget for 60fps rendering.

Transform Your Publishing Workflow

Our experts can help you build scalable, API-driven publishing systems tailored to your business.

Book a free consultation

Debugging Rendering Issues with Flutter DevTools

Whether you use Skia or Impeller, Flutter DevTools provides powerful diagnostic tools. The Frame Chart visualizes build and raster times for every frame, making it easy to spot frames that exceed the 16ms budget. The Timeline View shows detailed GPU and UI thread activity. For Impeller specifically, the shader cache viewer confirms that all shaders are pre-compiled. Common optimization patterns include wrapping expensive subtrees in `RepaintBoundary` to isolate repaint regions, using `cacheWidth` and `cacheHeight` on `Image` widgets to decode images at display resolution rather than full resolution, and preferring `Transform` over `Opacity` for animated visual effects.

Migrating an Existing App from Skia to Impeller

Enabling Impeller is straightforward: run your app with `flutter run --enable-impeller` or add `--enable-impeller` to your build command. For iOS, Impeller is already the default engine in Flutter 3.16+. For Android, Impeller is available as an opt-in. After enabling, systematically test all shader-heavy screens: animated page transitions, custom painters, blur effects, and complex clip paths. Check for Skia-specific plugin incompatibilities—some plugins that directly access the Skia canvas API may need updates. Run your full test suite under Impeller and compare frame timings against your Skia baseline using DevTools.

When to Stay on Skia: Edge Cases and Legacy Considerations

While Impeller is the clear future, there are scenarios where Skia remains the pragmatic choice. If your app depends on custom `SkiaShader` objects or C++ plugins that directly interface with the Skia rendering context, those plugins will need to be rewritten for Impeller's API. Apps targeting very old Android devices (pre-Vulkan, API level < 24) will use the OpenGL ES fallback, which may not deliver the full Impeller performance advantage. Finally, if your app is extremely simple (a static content reader with minimal animations), the Skia-to-Impeller migration offers negligible user-facing benefit and can be deferred to a later Flutter upgrade cycle.

FAQ

Frequently Asked Questions

Common questions about this topic, answered by our engineering team.

Skia compiles GPU shader programs at runtime the first time a visual effect is encountered. This compilation can take 50-200ms, causing visible frame drops. The jank only occurs on first encounter because subsequent uses are cached, but it creates a poor first impression during animations.

Impeller pre-compiles ALL shaders at build time into platform-specific GPU bytecode (Metal IR for iOS, SPIR-V for Android). At runtime, the GPU receives ready-to-execute instructions with zero compilation delay, completely eliminating the entire category of first-frame shader jank.

As of Flutter 3.16+, Impeller is the default engine on iOS. On Android, it is available as an opt-in via the --enable-impeller flag. Google is working toward making Impeller the default on Android as well, with Skia being retained only for legacy fallback scenarios.

Run your app with `flutter run --enable-impeller` or add the flag to your build command. For iOS, Impeller is already default in Flutter 3.16+. After enabling, test all shader-heavy screens and check for Skia-specific plugin incompatibilities.

Stay on Skia if your app uses custom SkiaShader objects or C++ plugins that directly access the Skia canvas API, targets very old Android devices without Vulkan support (pre-API 24), or is extremely simple with minimal animations where the migration offers negligible user benefit.

Discussion

Join the Conversation

Ready when you are

Let's build something great together.

A 30-minute call with a principal engineer. We'll listen, sketch, and tell you whether we're the right partner — even if the answer is no.

Talk to a strategist
Need help with your project? Let's talk.
Book a call