Sobes.tech
Senior

Jakie są Twoje znajomości na temat przepływów w Embedder?

sobes.tech AI

Odpowiedź od AI

Embedder w Flutterze odpowiada za dostarczanie usług specyficznych dla platformy i integrację z systemem operacyjnym. Zarządza wątkami niezbędnymi do prawidłowego działania silnika Flutter i aplikacji:

  • Wątek UI: Główny wątek, na którym wykonywany jest kod Twojej aplikacji, renderowany jest interfejs użytkownika i obsługiwane są zdarzenia dotykowe. Jest kluczowy dla responsywności aplikacji. Zablokowanie tego wątku powoduje "zamrożenia" i spadek FPS.
  • Wątek GPU: Odpowiada za przesyłanie instrukcji renderowania do procesora graficznego.
  • Wątek IO: Używany do wykonywania kosztownych operacji wejścia/wyjścia, takich jak praca z plikami, siecią, bazą danych, aby nie blokować wątku UI.
  • Wątek platformy: Wątek, na którym wykonywane są wywołania do natywnych API platformy (np. Android Activity lub iOS ViewController).

Embedder zapewnia, że te wątki są tworzone i poprawnie współdziałają, aby zapewnić płynne i wydajne działanie aplikacji. Silnik Flutter i framework wykonują większość pracy związanej z rozdzielaniem zadań między wątkami, ale programista musi uważać na operacje blokujące, które mogą przypadkowo wpłynąć na wątek UI. Do operacji asynchronicznych i pracy z innymi wątkami używa się async/await, Isolate (do naprawdę równoległych obliczeń) i kanałów platformowych.

Użycie Isolate do pracy w tle:

// Funkcja, która będzie wykonywana w osobnym Isolate
void heavyComputation(SendPort sendPort) {
  // Wykonujemy kosztowne obliczenia
  int result = 0;
  for (int i = 0; i < 1000000000; i++) {
    result += i;
  }
  // Wysyłamy wynik z powrotem
  sendPort.send(result);
}

// Tworzenie i uruchamianie nowego Isolate
void runHeavyTask() async {
  ReceivePort receivePort = ReceivePort();
  Isolate isolate = await Isolate.spawn(heavyComputation, receivePort.sendPort);

  // Słuchamy wiadomości od Isolate
  receivePort.listen((message) {
    print('Wynik obliczeń: $message');
    isolate.kill(); // Zatrzymujemy Isolate po otrzymaniu wyniku
  });
}

Różnica między async/await a Isolate:

Funkcja async/await Isolate
Paralelizm Konkurencja na jednym wątku Prawdziwy paralelizm na wielu rdzeniach
Komunikacja Niejawna (przez Future) Jawna (porty SendPort/ReceivePort)
Izolacja Brak izolacji pamięci Pełna izolacja pamięci
Lepsze do I/O nieblokujące, krótkie zadania Długie, ciężkie obliczenia

Znajomość tych wątków i zasad ich działania jest kluczowa dla pisania wydajnych aplikacji Flutter.