Impeller é um mecanismo de renderização moderno para Flutter, desenvolvido pelo Google para substituir o Skia e resolver seus problemas fundamentais: travamentos de shaders (jank) durante a primeira renderização de quadros, alto consumo de memória e a complexidade de suportar diferentes backends gráficos. Ao contrário do Skia, o Impeller compila shaders antecipadamente (offline), usa SPIR-V como representação intermediária e funciona diretamente com Vulkan, Metal e Direct3D 12. De acordo com Flutter Team (2025), o Impeller elimina até 95% dos travamentos de shaders, garantindo 60 FPS previsíveis mesmo em dispositivos de entrada.
Pontos principais
Impeller é um mecanismo de renderização gráfica de código aberto escrito em C++, desenvolvido pela equipe Flutter para substituir o Skia como renderizador principal. O projeto foi anunciado em 2021 como resposta ao problema de longa data de shader jank que o Skia sofre. O Impeller não é um fork do Skia — é uma implementação completamente nova, projetada considerando as limitações de GPUs móveis e APIs gráficas modernas.
A ideia principal do Impeller é mover a compilação de shaders para a fase de compilação do aplicativo, em vez do tempo de execução. No Skia, os shaders são compilados no primeiro uso, quando o usuário já está interagindo com o aplicativo. O Impeller compila todos os shaders antecipadamente (offline), empacota-os no formato binário SPIR-V e os distribui com o aplicativo. Durante a execução, o Impeller carrega shaders pré-compilados, eliminando atrasos de compilação.
O Impeller também resolve o problema de consumo de memória. O Skia cria muitos objetos temporários (texturas, buffers) durante a renderização, causando fragmentação de memória em dispositivos com recursos limitados. O Impeller usa pools de memória e reutiliza recursos alocados, reduzindo o consumo máximo de memória em 30–40%.
SPIR-V (Standard Portable Intermediate Representation) é uma representação intermediária de shaders desenvolvida pelo Khronos Group. O Impeller usa SPIR-V como formato universal para todos os shaders. Durante a compilação, shaders escritos na linguagem Impeller (um DSL personalizado em C++ para descrever efeitos) são compilados para SPIR-V. Em tempo de execução, o SPIR-V é carregado e traduzido para um formato específico da plataforma — MSL para Metal, GLSL para Vulkan ou DXIL para Direct3D 12.
A arquitetura do Impeller consiste em várias camadas, cada uma executando uma tarefa estritamente definida: processar a lista de comandos de renderização, gerenciar recursos da GPU e executar shaders. Essa modularidade facilita a adição de suporte para novas APIs gráficas.
A camada inferior é uma abstração sobre a API gráfica (Vulkan, Metal, Direct3D 12). O Impeller não suporta OpenGL, pois o OpenGL não fornece capacidades para compilação offline eficiente de shaders. Neste nível são implementados: gerenciamento de buffers de vértices, criação e cache de pipelines (pipelines gráficos) e sincronização de GPU. Um pipeline no Impeller é um estado de GPU pré-compilado que inclui shaders, configurações de rasterização e blending. Todos os pipelines são criados durante a inicialização, eliminando a compilação durante a renderização.
A camada intermediária é um sistema de gerenciamento de recursos. Ela aloca e reutiliza recursos da GPU: texturas, buffers, amostradores. Em vez de criar uma nova textura a cada quadro, o Impeller mantém um pool de texturas de vários tamanhos e formatos. O pool de memória retorna automaticamente recursos não utilizados e pode expandir quando necessário, mas sem a fragmentação característica do Skia.
A camada superior é o grafo de renderização, no qual o Flutter Engine converte comandos da Canvas API. O Impeller recebe uma Display List (lista de comandos de desenho) e constrói um grafo de dependências de operações a partir dela. O grafo é otimizado: passes de renderização redundantes são removidos, operações com o mesmo estado de GPU são mescladas. Em seguida, o grafo é compilado em uma sequência de chamadas Vulkan/Metal usando pipelines pré-criados.
Cada quadro passa por um pipeline fixo: Display List → grafo de renderização → compilação do grafo → envio de comandos GPU. Passes adicionais podem ser adicionados para pós-efeitos (desfoque, sombras) ou preparação do buffer de profundidade. O tempo de quadro no Impeller é mais previsível que no Skia, pois não há atrasos não determinísticos de compilação de shaders.
A comparação entre Impeller e Skia mostra diferenças na abordagem de renderização. Skia é uma biblioteca 2D de uso geral, enquanto Impeller é um mecanismo especializado para Flutter, otimizado para requisitos de UI móvel.
| Parâmetro | Skia | Impeller |
|---|---|---|
| Shaders | Compilação em tempo de execução | Compilação offline (tempo de compilação) |
| Shader jank | 50–200 ms no primeiro quadro | Ausente (0 ms) |
| Formato de shader | Proprietário (SkSL) | SPIR-V (universal) |
| Backends GPU | OpenGL, Vulkan, Metal | Vulkan, Metal, Direct3D 12 |
| Consumo de memória | Alto (texturas temporárias) | Pools de memória, até -40% |
| Plataformas | Android, iOS, Web, Desktop | Android, iOS, Desktop |
| Status | Estável (principal) | Preview (substituindo Skia) |
A principal diferença é a abordagem de shaders. O Skia compila shaders no momento do uso, criando shader jank ao renderizar efeitos desconhecidos pela primeira vez. O Impeller elimina isso através da compilação offline. Além disso, o Skia suporta OpenGL, necessário para a versão web do Flutter, mas o Impeller abandona o OpenGL em favor de APIs mais modernas, oferecendo melhor desempenho em dispositivos móveis.
Para aplicativos Flutter, a transição para o Impeller não requer alterações de código. O Impeller implementa a mesma Canvas API que o Skia, portanto todos os widgets, animações e desenhos personalizados funcionam da mesma forma. A compatibilidade reversa é garantida no nível do Flutter Engine — o mecanismo seleciona o renderizador (Skia ou Impeller) durante a inicialização do aplicativo.
O Impeller oferece várias vantagens mensuráveis em relação ao Skia que impactam diretamente a experiência do usuário e o desempenho dos aplicativos Flutter.
O shader jank é o principal problema do Skia que o Impeller resolve completamente. Quando um aplicativo Flutter exibe uma nova tela com gradientes, máscaras ou mesclagens não padrão, o Skia compila shaders durante a animação, causando queda de quadros. O Impeller compila todos os shaders na fase de compilação, portanto o primeiro quadro é renderizado tão rápido quanto os subsequentes. Em dispositivos com GPU lenta (MediaTek Helio, Qualcomm série 400), a diferença é especialmente perceptível — até 200 ms de atraso para cada novo tipo de efeito no Skia contra 0 ms no Impeller.
O Impeller usa pools de recursos para gerenciar a memória da GPU. No Skia, cada quadro pode criar novas texturas para superfícies temporárias, especialmente ao renderizar com transparência ou usar saveLayer. O Impeller reutiliza texturas entre quadros, reduzindo o consumo máximo de memória em 30–40% no Android e até 25% no iOS. Isso é especialmente importante para aplicativos com listas longas e animações, onde o Skia podia causar erros OOM em dispositivos com 2 GB de RAM.
No Skia, o tempo de renderização do quadro pode variar dependendo de quais shaders já foram compilados. O primeiro quadro com um novo efeito pode levar 50–200 ms, enquanto os subsequentes levam 3–5 ms. Essa imprevisibilidade dificulta a otimização e os testes. O Impeller garante um tempo de quadro consistente, pois todos os shaders já estão compilados e a alocação de memória é previsível. O Flutter Engine com Impeller pode calcular com mais precisão o orçamento de tempo para cada quadro.
O Impeller funciona diretamente com Vulkan (Android), Metal (iOS) e Direct3D 12 (Windows), sem a camada OpenGL. Isso oferece várias vantagens: menor latência do driver (até 50% menos do que através do OpenGL), controle direto sobre a memória da GPU e acesso a recursos modernos (arquitetura de GPU tileada, renderização orientada por GPU). O OpenGL não está mais evoluindo e seus drivers em dispositivos móveis frequentemente se tornam um gargalo de desempenho.
O Impeller está em desenvolvimento ativo e disponível nos canais Flutter Master e Beta. A partir do Flutter 3.16, o Impeller está ativado por padrão no iOS e opcionalmente no Android através de uma flag de configuração. A substituição completa do Skia pelo Impeller é esperada em um dos lançamentos estáveis do Flutter em 2026.
No iOS, o Impeller funciona através do Metal e está ativado por padrão desde o Flutter 3.16. A equipe Flutter recomenda testar aplicativos no Impeller e relatar problemas. Para reverter para o Skia, use a flag Impeller no arquivo Info.plist: FlutterEnableImpeller = NO. De acordo com Flutter Team, 92% dos aplicativos iOS rodam no Impeller sem regressões visíveis, e o desempenho das animações melhora em 25–40%.
No Android, o Impeller funciona através do Vulkan. Para ativar, adicione a meta-tag io.flutter.embedded_views_preview no AndroidManifest.xml. A equipe Flutter continua otimizando o Impeller para várias arquiteturas de GPU (Adreno, Mali, PowerVR). O principal desafio no Android é suportar dispositivos sem Vulkan (Android < 7.0 ou GPUs antigas). Para esses dispositivos, será usado um backend de fallback baseado em Skia ou Impeller com rasterização por software.
No Windows, o Impeller funciona através do Direct3D 12 (ativado no Flutter Master). No macOS e Linux — através de Metal e Vulkan respectivamente. O Impeller não está planejado para Web, pois a versão web do Flutter usa CanvasKit (Skia via WebAssembly), e o shader jank não é um problema crítico para ela devido a um mecanismo diferente de compilação de shaders no navegador. A versão web continuará usando Skia.
O Google publicou o roteiro do Impeller: 2024 — Impeller por padrão no iOS; 2025 — Impeller por padrão no Android e Windows; 2026 — remoção completa do Skia do Flutter Engine. Depois disso, o Flutter usará o Impeller como único mecanismo de renderização, simplificando a manutenção, reduzindo o tamanho do mecanismo e melhorando o desempenho em todas as plataformas.
Perguntas frequentes
No iOS, o Impeller está ativado por padrão desde o Flutter 3.16. No Android, adicione a meta-tag io.flutter.embedded_views_preview com o valor true no AndroidManifest.xml. No Windows, use a flag --enable-impeller ao iniciar. Em todos os casos, pode ser forçado através do FlutterEngine no código Dart.
O Skia funciona, mas tem problemas fundamentais: shader jank (50–200 ms de atraso na compilação de shaders), alto consumo de memória e limitações da arquitetura OpenGL. O Impeller é projetado especificamente para Flutter e resolve esses problemas através da compilação offline de shaders e pools de memória.
Sim, o Impeller implementa a mesma Canvas API que o Skia. Todos os widgets padrão do Flutter — texto, imagens, animações, pinturas personalizadas — funcionam no Impeller sem alterações. A compatibilidade reversa é garantida no nível do Flutter Engine, e a transição é transparente para o desenvolvedor.
Não, um aplicativo usa um mecanismo de renderização por vez. A escolha é feita ao inicializar o Flutter Engine através de uma flag. Alternar entre Skia e Impeller durante a execução do aplicativo é impossível — o renderizador é fixado até que a primeira instância do FlutterEngine seja criada.
O Skia continuará existindo como uma biblioteca independente do Google para Chrome, Android e outros projetos. No Flutter, o Skia será substituído pelo Impeller como renderizador principal. O Skia permanecerá para a versão web do Flutter (via CanvasKit) e como opção de fallback para dispositivos sem suporte a Vulkan/Metal.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.