Skia é uma biblioteca gráfica 2D de alto desempenho com código aberto, escrita em C++, que serve como o motor de renderização principal do Flutter. É responsável por converter widgets de alto nível e elementos de interface em pixels na tela, suportando renderização por software via CPU e aceleração por hardware via OpenGL, Vulkan e Metal. De acordo com Skia Documentation (2025), o Skia processa mais de 2 bilhões de quadros renderizados diariamente em dispositivos Android, Chrome e Flutter.
Principais pontos
Skia é uma biblioteca gráfica 2D multiplataforma desenvolvida pelo Google e disponível sob a licença BSD. Ela fornece uma API unificada para desenhar formas geométricas, texto, imagens e sombras, abstraindo o backend gráfico subjacente. Skia é escrita em C++ e otimizada para funcionar em uma ampla gama de dispositivos, desde telemóveis até servidores.
A história do Skia começou em 2005 como uma biblioteca proprietária da empresa Skia Inc. Em 2007, foi adquirida pelo Google, que abriu seu código-fonte e começou a usá-la em seus produtos. Hoje, Skia é o motor gráfico principal do Google Chrome (incluindo Chrome OS), Android (desde a versão 4.0) e, claro, Flutter. A biblioteca é mantida pela equipe do Google e é constantemente melhorada: novos backends, otimizações de desempenho e suporte para APIs gráficas modernas são adicionados.
A principal característica do Skia é que não é apenas um conjunto de funções para desenhar primitivas. É um pipeline gráfico completo que inclui rasterização de curvas (caminhos), anti-aliasing, sobreposição de máscaras, tratamento de transparência e correção de cor. Skia suporta formatos de imagem PNG, JPEG, WebP e GIF, e pode renderizar texto através do motor HarfBuzz para modelagem de glifos.
Ao contrário do Cairo (usado no GTK) ou Quartz 2D (usado no macOS), o Skia foi originalmente projetado para funcionar em múltiplas plataformas com diferentes APIs gráficas. Isso lhe confere vantagem em frameworks multiplataforma como Flutter. Cairo é orientado para renderização por software, enquanto Skia suporta aceleração GPU desde o início, algo crítico para animações de interface.
A arquitetura do Skia é construída como um pipeline multicamadas, onde cada camada é responsável por um estágio específico de conversão de comandos gráficos em pixels. Essa estrutura permite reutilizar as camadas superiores independentemente da API gráfica subjacente.
A camada superior — Canvas API — fornece ao desenvolvedor uma abstração para desenho. Os métodos drawRect, drawCircle, drawPath, drawText aceitam parâmetros geométricos e estilos (cor, transparência, transformações). O Canvas converte esses comandos em uma sequência de operações que são passadas para o Skia Pipeline — um grafo interno de comandos otimizado antes da execução.
A camada intermediária — Surface e Device — gerencia o buffer de destino onde ocorre a renderização. A Surface é criada com o tamanho, espaço de cor e tipo de backend especificados. O Device implementa um backend de renderização específico: rasterizador CPU (Raster), OpenGL (GL), Vulkan (Vk) ou Metal (Mt). O Device contém implementações otimizadas de cada operação de desenho para um backend específico.
A camada inferior — Ganesha (backend GPU) — implementa a renderização acelerada por hardware. Ganesha usa a GPU para rasterização de caminhos, preenchimentos de gradiente e sobreposição de efeitos. Ela coleta comandos em lotes e minimiza a alternância de estado da GPU. Cada API gráfica tem sua própria implementação Ganesha: Skia GL para OpenGL, Skia Vulkan para Vulkan, Skia Metal para Metal.
Skia usa sua própria linguagem de shaders SkSL (Skia Shading Language) para descrever efeitos. O código SkSL é compilado em SPIR-V (representação intermediária), que é então traduzido para um formato de shader específico do backend (GLSL, HLSL, MSL). Isso fornece uma maneira unificada de descrever efeitos gráficos independentemente da plataforma.
Flutter usa Skia como motor de renderização principal em todas as plataformas: Android, iOS, Web, Windows, macOS e Linux. Quando um aplicativo Flutter renderiza um quadro, os widgets são convertidos em uma árvore RenderObject, que é então passada para a camada Engine (em C++), e o Engine usa Skia para a renderização final.
O processo de renderização de um quadro inclui várias etapas. Primeiro, o Flutter Engine constrói uma Display List — uma sequência de chamadas da API Canvas descrevendo o que e como desenhar. Esta lista é então passada para Skia, que divide as operações em partições (áreas da tela), as ordena por profundidade e as passa para o backend de renderização correspondente. A aceleração GPU é ativada automaticamente se Skia detetar uma API gráfica disponível.
Uma das principais vantagens do Skia no Flutter é o Flutter Impeller Preview — a capacidade de pré-visualizar shaders. Skia compila shaders no momento do primeiro uso, o que pode causar atrasos (shader jank). Para resolver este problema, o Flutter está migrando para Impeller — um novo motor de renderização, mas Skia continua sendo a escolha principal para versões estáveis do Flutter.
Flutter usa o conceito de Layer Tree — uma árvore de camadas, cada uma representando uma parte da UI. Skia recebe comandos de desenho para cada camada e determina se várias camadas podem ser combinadas em uma única passagem de renderização. A composição de camadas é uma tarefa complexa, pois para cada pixel é preciso considerar transparência e modos de mistura (blend modes), que Skia implementa através de shaders GPU.
Skia renderiza texto através da integração com as bibliotecas HarfBuzz (modelagem) e ICU (unicode). No Flutter, cada widget de texto cria um objeto Paragraph que converte o texto em uma série de comandos Skia para desenhar glifos. Skia suporta anti-aliasing subpixel, hinting de fontes e trabalho com emojis através da biblioteca SkUnicode.
O desempenho do Skia é resultado de anos de otimização e da combinação de várias técnicas: agrupamento de comandos em lote, cache de texturas e minimização da alternância de contexto da GPU. Isso é criticamente importante para o Flutter, pois cada quadro deve ser renderizado em 16 ms (60 FPS) ou 8 ms (120 FPS).
| Técnica | Descrição | Ganho |
|---|---|---|
| Batching | Agrupar operações semelhantes em uma única chamada de desenho | até 3x |
| Cache de texturas | Reutilizar texturas já carregadas na GPU | até 2x |
| Atlas | Combinar texturas pequenas em um atlas de texturas grande | até 1.5x |
| Renderização diferida | Execução atrasada de comandos com reordenação | até 2x |
| Pré-compilação de shaders | Compilação antecipada de shaders para Spark/Dart | até 4x |
De acordo com benchmarks da Equipe Flutter, o uso de Skia com aceleração GPU em dispositivos de gama média (Qualcomm Snapdragon 700 series) proporciona 60 FPS estáveis ao renderizar interfaces complexas com mais de 30 widgets na tela. Com renderização por software (CPU), o desempenho cai 40–60%, mas permanece aceitável para telas simples.
O principal problema de desempenho do Skia no Flutter é o shader jank (travamentos por shaders). Quando um novo elemento visual com uma combinação desconhecida de efeitos aparece na tela, Skia compila um novo shader em tempo real. A compilação pode levar de 50 a 200 ms, durante os quais a aplicação perde quadros. Isso é especialmente notável ao percorrer listas longas com decorações personalizadas. O Google está resolvendo esse problema com o Impeller, um novo motor de renderização que compila shaders antecipadamente.
Skia suporta uma ampla variedade de plataformas, cada uma usando seu próprio backend de renderização. A escolha do backend é determinada durante a compilação do Flutter Engine com base na plataforma de destino e nas APIs gráficas disponíveis.
No Android, o Skia funciona através de OpenGL ES (em todos os dispositivos) e Vulkan (em dispositivos Android 7.0+ com suporte Vulkan). A seleção do backend é automática: Vulkan é preferido por oferecer menor latência de driver. O Android também usa Skia para renderização da UI do sistema através do HWUI (Hardware Accelerated UI), tornando Skia parte do sistema operacional, não apenas do Flutter.
No iOS, o Skia usa Metal — a API gráfica proprietária da Apple. Metal fornece acesso de baixo nível à GPU com sobrecarga mínima. Antes da introdução do Metal (2014), o Skia no iOS usava OpenGL ES, mas nas versões atuais do Flutter o Metal é o único backend GPU para iOS, proporcionando uma melhoria de desempenho de até 30% em comparação com OpenGL.
No desktop, o Skia usa OpenGL (macOS, Linux) e Direct3D 12 (Windows). O suporte para Direct3D 12 foi adicionado no Flutter 3.13 para Windows e proporciona uma melhoria significativa de desempenho em relação ao OpenGL no Windows. Skia também suporta renderização por software através do ANGLE (OpenGL sobre Direct3D) no Windows para compatibilidade reversa com drivers gráficos antigos.
No Flutter for Web, o Skia é compilado para WebAssembly (via Emscripten) e renderiza através de WebGL. Neste modo, o Skia funciona inteiramente no navegador sem usar código nativo. O desempenho da versão WebGL do Skia é inferior ao dos backends nativos, mas para a maioria das aplicações web são alcançados 60 FPS em navegadores modernos com aceleração WebGL por hardware.
Perguntas frequentes
Shader jank é um atraso na renderização causado pela compilação de shaders em tempo real. Quando o Skia encontra uma nova combinação de efeitos visuais, ele compila um shader, o que pode levar de 50 a 200 ms, durante os quais os quadros são perdidos. Este problema é resolvido no Impeller com a compilação antecipada de shaders.
Sim, o Skia pode ser usado como uma biblioteca gráfica independente. É usado no Google Chrome, Android, Mozilla Firefox (através da camada Skia) e em projetos que exigem gráficos 2D de alto desempenho. A API Skia está disponível em C++, Python e através de bindings em outras linguagens.
O Flutter usa um fork do Skia (geralmente o último commit estável do repositório principal do Google). A versão é atualizada a cada lançamento do Flutter Engine. O commit atual pode ser encontrado no arquivo DEPS no repositório flutter/engine no GitHub.
Skia compila shaders em tempo de execução, o que causa shader jank. Impeller compila shaders offline, usa SPIR-V e funciona diretamente através de Vulkan/Metal/Direct3D 12. Impeller não sofre de shader jank e oferece desempenho mais previsível.
Skia em si não é um motor de animação — é responsável pela renderização de quadros individuais. A animação no Flutter é implementada ao nível do framework (AnimationController, Tween), enquanto Skia garante renderização rápida de cada quadro usando a API Canvas e aceleração por hardware.
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.