Что такое Skia и как она используется в Flutter?

Ответ

Skia — это высокопроизводительная кроссплатформенная 2D-графическая библиотека с открытым исходным кодом, разработанная Google. Flutter использует Skia в качестве движка для рендеринга всего пользовательского интерфейса.

Роль Skia во Flutter:

  1. Отрисовка: Каждый виджет Flutter в конечном итоге преобразуется в набор графических примитивов (рисунков, текста, теней), которые отрисовываются с помощью Skia.
  2. Аппаратное ускорение: Skia использует GPU (через OpenGL, Vulkan, Metal или DirectX) для быстрой отрисовки, что обеспечивает плавную анимацию в 60/120 FPS.
  3. Кроссплатформенность: Поскольку Flutter сам рисует UI, а не использует нативные компоненты, Skia позволяет иметь идентичный внешний вид и поведение на iOS, Android, Web и Desktop.

Прямая работа с Skia во Flutter: Вы можете использовать низкоуровневый API рисования через класс CustomPainter:

class MyCirclePainter extends CustomPainter {
  @override
  void paint(Canvas canvas, Size size) {
    // Canvas предоставляется движком Skia
    final paint = Paint()
      ..color = Colors.blue
      ..style = PaintingStyle.fill;
    // Рисуем круг, используя примитивы Skia
    canvas.drawCircle(Offset(size.width / 2, size.height / 2), 50.0, paint);
  }

  @override
  bool shouldRepaint(covariant CustomPainter oldDelegate) => false;
}

// Использование в UI
CustomPaint(
  size: const Size(200, 200),
  painter: MyCirclePainter(),
)

Благодаря Skia, Flutter обеспечивает полный контроль над пикселями на экране и высокую производительность графики.

Ответ 18+ 🔞

Давай разберём, как эта штука работает, а то звучит как какая-то магия, но на самом деле всё, блядь, логично.

Представь себе, что Skia — это невероятно прокачанный, ебать мои старые костыли, художник-робот. Его наняли в Flutter на одну-единственную работу: брать инструкции и нихуя не философствуя, с овердохуищной скоростью, переносить их на экран. Не через системные кисточки, а напрямую, своим лазерным глазом.

Зачем он вообще нужен, этот Skia?

  1. Он рисует ВСЁ. Абсолютно каждый пиксель, который ты видишь в приложении на Flutter — кнопка, тень, закруглённый уголчик, анимированная иконка — это его рук дело. Flutter говорит: "Нарисуй вот эту хрень здесь", а Skia отвечает: "Уже сделано, ёпта".
  2. Он жрёт железо. В хорошем смысле. Вместо того чтобы ковыряться процессором, он скидывает всю тяжёлую работу на видеокарту (GPU). Поэтому интерфейс и летает как угорелый на 60 кадрах, а то и на 120. Без этого был бы слайд-шоу, а не приложение.
  3. Он — главный по тарелочкам. Хочешь, чтобы приложение выглядело и работало абсолютно одинаково на айфоне, андроиде, в браузере и на маке? Вот именно для этого. Поскольку рисует он сам, а не просит систему: "Эй, дай мне свою стандартную кнопку", то и выглядит везде оно как близнецы-братья. Никаких сюрпризов.

А можно с ним пообщаться напрямую? Конечно, можно! Для этого есть штука под названием CustomPainter. Это как если бы ты дал нашему художнику-роботу чистый холст и сказал: "Вот тебе кисть (Canvas от Skia), вот краски (Paint), давай, твори, я доверяю".

Вот смотри, простейший пример, как нарисовать хуй с горы, то есть, прости, синий круг:

class MyCirclePainter extends CustomPainter {
  @override
  void paint(Canvas canvas, Size size) {
    // Кисть (Paint) — это понятия Skia
    final paint = Paint()
      ..color = Colors.blue
      ..style = PaintingStyle.fill;
    // А это команда роботу-художнику: "Нарисуй круг вот тут"
    canvas.drawCircle(Offset(size.width / 2, size.height / 2), 50.0, paint);
  }

  @override
  bool shouldRepaint(covariant CustomPainter oldDelegate) => false;
}

// И вешаем этот холст в интерфейс
CustomPaint(
  size: const Size(200, 200),
  painter: MyCirclePainter(),
)

Короче, вся фишка Flutter в том, что он не просит систему нарисовать ему кнопку. Он сам, через своего личного терминатора Skia, говорит каждому пикселю на экране, каким цветом ему гореть. Поэтому и контроль полный, и производительность — ядрёна вошь. Вот и вся магия, без всякого ёперного театра.