Ответ
Архитектура выполнения Flutter построена на нескольких изолированных потоках, которые взаимодействуют через механизм передачи сообщений. Это обеспечивает отзывчивый UI.
Ключевые потоки в Embedder:
-
Платформенный поток (Platform Thread / Main Thread):
- Это нативный поток ОС (например, основной поток UI в Android или iOS).
- Здесь запускается
FlutterEngineи обрабатываются вызовы платформенных каналов (Platform Channels). - Важно: Длительные операции (сеть, файлы) не должны выполняться здесь, чтобы не блокировать нативный UI.
-
Поток UI (UI Thread / Runner Thread):
- Главный поток выполнения Dart-кода. Здесь работает изолят Dart, в котором выполняется весь код приложения, включая
build()-методы, бизнес-логику и обработку жестов. - Он не является тем же потоком, что и платформенный. Взаимодействие между ними происходит асинхронно через сообщения.
- Главный поток выполнения Dart-кода. Здесь работает изолят Dart, в котором выполняется весь код приложения, включая
-
Поток GPU (GPU Thread):
- Отвечает за преобразование слоев визуализации (layer tree) в команды для графического API (OpenGL, Metal, Vulkan).
- Работает параллельно с UI Thread. UI Thread подготавливает frame (кадр), а GPU Thread его рендерит.
-
Поток ввода-вывода (IO Thread):
- Обрабатывает ресурсоемкие задачи, которые не должны блокировать UI Thread, но не являются строго графическими. Например, декодирование изображений из формата
png/jpgвrawперед передачей на GPU Thread.
- Обрабатывает ресурсоемкие задачи, которые не должны блокировать UI Thread, но не являются строго графическими. Например, декодирование изображений из формата
Схема взаимодействия:
[Platform Thread] <--(Platform Channels)--> [UI Thread (Dart Isolate)]
|
| (Layer Tree)
v
[GPU Thread]
^
| (Raw Image Data)
[IO Thread]
Практический вывод: Поскольку код Dart выполняется в одном изоляте (UI Thread), для выполнения CPU-интенсивных задач без блокировки интерфейса необходимо использовать изоляты Dart (Dart Isolates), которые являются аналогом потоков, но с разделяемой памятью.