Skia es una biblioteca gráfica 2D de alto rendimiento con código abierto, escrita en C++, que sirve como el motor de renderizado principal de Flutter. Es responsable de convertir los widgets de alto nivel y los elementos de la interfaz en píxeles en la pantalla, compatible con renderizado por software mediante CPU y aceleración por hardware a través de OpenGL, Vulkan y Metal. Según Skia Documentation (2025), Skia procesa más de 2 mil millones de fotogramas renderizados diariamente en dispositivos Android, Chrome y Flutter.
Puntos clave
Skia es una biblioteca gráfica 2D multiplataforma desarrollada por Google y disponible bajo la licencia BSD. Proporciona una API unificada para dibujar formas geométricas, texto, imágenes y sombras, abstrayendo el backend gráfico subyacente. Skia está escrita en C++ y optimizada para funcionar en una amplia gama de dispositivos, desde teléfonos móviles hasta servidores.
La historia de Skia comenzó en 2005 como una biblioteca privativa de la empresa Skia Inc. En 2007 fue adquirida por Google, que abrió su código fuente y comenzó a usarla en sus productos. Hoy, Skia es el motor gráfico principal de Google Chrome (incluyendo Chrome OS), Android (desde la versión 4.0) y, por supuesto, Flutter. La biblioteca es mantenida por el equipo de Google y se mejora constantemente: se añaden nuevos backends, optimizaciones de rendimiento y soporte para API gráficas modernas.
La característica clave de Skia es que no es solo un conjunto de funciones para dibujar primitivas. Es un pipeline gráfico completo que incluye rasterización de curvas (trazados), suavizado (anti-aliasing), superposición de máscaras, gestión de transparencia y corrección de color. Skia admite formatos de imagen PNG, JPEG, WebP y GIF, y puede renderizar texto mediante el motor HarfBuzz para el glifo de glifos.
A diferencia de Cairo (usado en GTK) o Quartz 2D (usado en macOS), Skia fue diseñada desde el principio para funcionar en múltiples plataformas con diferentes API gráficas. Esto le da una ventaja en frameworks multiplataforma como Flutter. Cairo está orientado al renderizado por software, mientras que Skia ha soportado la aceleración GPU desde sus inicios, algo crítico para las animaciones de interfaz.
La arquitectura de Skia está construida como un pipeline multicapa, donde cada capa se encarga de una etapa específica de conversión de comandos gráficos en píxeles. Esta estructura permite reutilizar las capas superiores independientemente de la API gráfica subyacente.
La capa superior — Canvas API — proporciona al desarrollador una abstracción para dibujar. Los métodos drawRect, drawCircle, drawPath, drawText aceptan parámetros geométricos y estilos (color, transparencia, transformaciones). Canvas convierte estos comandos en una secuencia de operaciones que se pasan al Skia Pipeline — un grafo interno de comandos que se optimiza antes de la ejecución.
La capa intermedia — Surface y Device — gestiona el búfer de destino en el que se produce el renderizado. Surface se crea con el tamaño, espacio de color y tipo de backend especificados. Device implementa un backend de renderizado concreto: rasterizador CPU (Raster), OpenGL (GL), Vulkan (Vk) o Metal (Mt). Device contiene implementaciones optimizadas de cada operación de dibujo para un backend específico.
La capa inferior — Ganesha (backend GPU) — implementa el renderizado acelerado por hardware. Ganesha utiliza la GPU para la rasterización de trazados, rellenos de degradados y superposición de efectos. Agrupa comandos en lotes y minimiza los cambios de estado de la GPU. Cada API gráfica tiene su propia implementación de Ganesha: Skia GL para OpenGL, Skia Vulkan para Vulkan, Skia Metal para Metal.
Skia utiliza su propio lenguaje de shaders SkSL (Skia Shading Language) para describir efectos. El código SkSL se compila en SPIR-V (representación intermedia), que luego se traduce a un formato de shader específico del backend (GLSL, HLSL, MSL). Esto proporciona una forma unificada de describir efectos gráficos independientemente de la plataforma.
Flutter utiliza Skia como motor de renderizado principal en todas las plataformas: Android, iOS, Web, Windows, macOS y Linux. Cuando una aplicación Flutter renderiza un fotograma, los widgets se convierten en un árbol RenderObject, que luego se pasa a la capa Engine (en C++), y el Engine usa Skia para el renderizado final.
El proceso de renderizado de un fotograma incluye varias etapas. Primero, el Flutter Engine construye una lista de operaciones (Display List) — una secuencia de llamadas a la API de Canvas que describen qué y cómo dibujar. Luego, esta lista se pasa a Skia, que divide las operaciones en particiones (áreas de pantalla), las ordena por profundidad y las pasa al backend de renderizado correspondiente. La aceleración GPU se activa automáticamente si Skia detecta una API gráfica disponible.
Una de las ventajas clave de Skia en Flutter es Flutter Impeller Preview — la posibilidad de previsualizar shaders. Skia compila los shaders en el momento del primer uso, lo que puede causar retardos (shader jank). Para solucionar este problema, Flutter está migrando a Impeller — un nuevo motor de renderizado, pero Skia sigue siendo la opción principal para las versiones estables de Flutter.
Flutter usa el concepto de Layer Tree — un árbol de capas, cada una representando una parte de la interfaz. Skia recibe comandos de dibujo para cada capa y determina si se pueden combinar varias capas en un solo pase de renderizado. La composición de capas es una tarea compleja, ya que para cada píxel hay que tener en cuenta la transparencia y los modos de fusión (blend modes), que Skia implementa mediante shaders de GPU.
Skia renderiza texto mediante la integración con las bibliotecas HarfBuzz (glifo) e ICU (unicode). En Flutter, cada widget de texto crea un objeto Paragraph que convierte el texto en una serie de comandos de Skia para dibujar glifos. Skia admite suavizado subpíxel (subpixel anti-aliasing), hinting de fuentes y trabajo con emojis mediante la biblioteca SkUnicode.
El rendimiento de Skia es el resultado de años de optimización y la combinación de varias técnicas: agrupación de comandos por lotes, almacenamiento en caché de texturas y minimización de cambios de contexto de GPU. Esto es críticamente importante para Flutter, ya que cada fotograma debe renderizarse en 16 ms (60 FPS) u 8 ms (120 FPS).
| Técnica | Descripción | Mejora |
|---|---|---|
| Batching | Agrupación de operaciones similares en una sola llamada de dibujo | hasta 3x |
| Caché de texturas | Reutilización de texturas ya cargadas en la GPU | hasta 2x |
| Atlas | Combinación de texturas pequeñas en un atlas de texturas grande | hasta 1.5x |
| Renderizado diferido | Ejecución retardada de comandos con reordenación | hasta 2x |
| Precompilación de shaders | Compilación anticipada de shaders para Spark/Dart | hasta 4x |
Según los benchmarks del Flutter Team, el uso de Skia con aceleración GPU en dispositivos de gama media (Qualcomm Snapdragon 700 series) proporciona unos estables 60 FPS al renderizar interfaces complejas con más de 30 widgets en pantalla. Con renderizado por software (CPU), el rendimiento cae entre un 40 y un 60%, pero sigue siendo aceptable para pantallas simples.
El principal problema de rendimiento de Skia en Flutter es el shader jank (tirones por shaders). Cuando aparece en pantalla un nuevo elemento visual con una combinación de efectos desconocida, Skia compila un nuevo shader sobre la marcha. La compilación puede llevar de 50 a 200 ms, durante los cuales la aplicación pierde fotogramas. Esto es especialmente notable al hacer scroll en listas largas con decoraciones personalizadas. Google está solucionando este problema con Impeller, un nuevo motor de renderizado que compila los shaders por adelantado.
Skia es compatible con una amplia gama de plataformas, cada una utilizando su propio backend de renderizado. La elección del backend se determina durante la compilación del Flutter Engine según la plataforma objetivo y las API gráficas disponibles.
En Android, Skia funciona a través de OpenGL ES (en todos los dispositivos) y Vulkan (en dispositivos con Android 7.0+ compatibles con Vulkan). La selección del backend es automática: se prefiere Vulkan porque proporciona menor latencia de driver. Android también usa Skia para el renderizado de la UI del sistema a través de HWUI (Hardware Accelerated UI), lo que convierte a Skia en parte del sistema operativo, no solo de Flutter.
En iOS, Skia utiliza Metal — la API gráfica propietaria de Apple. Metal proporciona acceso de bajo nivel a la GPU con una sobrecarga mínima. Antes de la introducción de Metal (2014), Skia en iOS usaba OpenGL ES, pero en las versiones actuales de Flutter Metal es el único backend GPU para iOS, lo que proporciona una mejora de rendimiento de hasta el 30% en comparación con OpenGL.
En escritorio, Skia utiliza OpenGL (macOS, Linux) y Direct3D 12 (Windows). El soporte para Direct3D 12 se añadió en Flutter 3.13 para Windows y proporciona una mejora significativa de rendimiento respecto a OpenGL en Windows. Skia también admite renderizado por software mediante ANGLE (OpenGL sobre Direct3D) en Windows para compatibilidad inversa con controladores gráficos antiguos.
En Flutter for Web, Skia se compila a WebAssembly (mediante Emscripten) y renderiza a través de WebGL. En este modo, Skia funciona completamente en el navegador sin usar código nativo. El rendimiento de la versión WebGL de Skia es inferior al de los backends nativos, pero para la mayoría de las aplicaciones web se alcanzan 60 FPS en navegadores modernos con aceleración hardware WebGL.
Preguntas frecuentes
Shader jank es un retardo en el renderizado causado por la compilación de shaders sobre la marcha. Cuando Skia encuentra una nueva combinación de efectos visuales, compila un shader, lo que puede llevar de 50 a 200 ms, durante los cuales se pierden fotogramas. Este problema se resuelve en Impeller compilando los shaders por adelantado.
Sí, Skia puede usarse como biblioteca gráfica independiente. Se utiliza en Google Chrome, Android, Mozilla Firefox (a través de la capa Skia) y en proyectos que requieren gráficos 2D de alto rendimiento. La API de Skia está disponible en C++, Python y mediante bindings en otros lenguajes.
Flutter utiliza un fork de Skia (generalmente el último commit estable del repositorio principal de Google). La versión se actualiza con cada lanzamiento del Flutter Engine. El commit actual se puede encontrar en el archivo DEPS del repositorio flutter/engine en GitHub.
Skia compila los shaders en tiempo de ejecución, lo que causa shader jank. Impeller compila los shaders por adelantado (offline), usa SPIR-V y funciona directamente a través de Vulkan/Metal/Direct3D 12. Impeller no sufre de shader jank y proporciona un rendimiento más predecible.
Skia en sí misma no es un motor de animación — se encarga del renderizado de fotogramas individuales. La animación en Flutter se implementa a nivel de framework (AnimationController, Tween), mientras que Skia garantiza un renderizado rápido de cada fotograma mediante la API de Canvas y la aceleración por hardware.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.