SurfaceFlinger i WindowManager

SurfaceFlinger akceptuje bufory, tworzy bufory i wysyła bufory do wyświetlacz. WindowManager udostępnia SurfaceFlingerowi bufory i metadane okna, których używa do łączenia powierzchni z wyświetlaczem.

SurfaceFlinger

SurfaceFlinger może akceptować bufory na dwa sposoby: przez BufferQueue i SurfaceControl lub ASurfaceControl.

Jedną z metod, za pomocą której SurfaceFlinger akceptuje bufory, jest BufferQueue i SurfaceControl. Gdy aplikacja przechodzi na pierwszy plan, prosi o bufory WindowManagera. WindowManager następnie żąda warstwy z SurfaceFlinger. Warstwa to połączenie elementu surface, który zawiera BufferQueue, oraz element SurfaceControl, który zawiera metadane warstwy, takie jak ramka wyświetlacza. SurfaceFlinger tworzy warstwę i wysyła ją do WindowManager. Następnie WindowManager wysyła powierzchnię do aplikacji, ale zachowuje kontroler powierzchni, aby manipulować wyglądem aplikacji na ekranie.

Android 10 dodaje ASurfaceControl, który jest dodatkowym sposobem na to, aby SurfaceFlinger mógł akceptować bufory. ASurfaceControl łączy powierzchnię i SurfaceControl w jeden pakiet transakcji, który jest wysyłany do SurfaceFlinger. Element ASurfaceControl jest powiązany z warstwą, do której aplikacje aktualizować za pomocą ASurfaceTransaction. Aplikacje otrzymują informacje o transakcjach ASurfaceTransactions za pomocą wywołań zwrotnych, które przekazują statystyki ASurfaceTransactionStats, zawierające informacje takie jak czas blokady, czasy pozyskiwania itp.

W tabeli poniżej znajdziesz więcej informacji o komponencie ASurfaceControl i powiązanych z nim komponentach.

Komponent Opis
ASurfaceControl Obejmuje SurfaceControl i umożliwia aplikacji tworzenie elementów SurfaceControl, które odpowiadają warstwom na wyświetlaczu.

Można je utworzyć jako element podrzędny ANativeWindow lub jako element podrzędny innego elementu ASurfaceControl.
ASurfaceTransaction Zawija transakcję, aby umożliwić klientowi edytowanie właściwości opisowych warstwy, takich jak geometria, oraz wysyła zaktualizowane bufory do SurfaceFlinger.
Statystyki transakcji na platformie Wysyła informacje o przedstawionych transakcjach, np. czasu zatrzasku, pozyskiwania i wcześniejszej wersji wcześniej zarejestrowane wywołanie zwrotne.

Aplikacje mogą przesyłać bufory w dowolnym momencie, ale usługa SurfaceFlinger budzi się tylko po to, aby zaakceptować bufory między odświeżaniem wyświetlacza, co może się różnić w zależności od urządzenia. Pozwala to zminimalizować wykorzystanie pamięci i zapobiega widocznemu rozrywania obrazu na ekranie, które może wystąpić podczas aktualizacji wyświetlacza w trakcie odświeżania.

Gdy wyświetlacz jest w międzyczasie odświeżania, wysyła sygnał VSYNC do SurfaceFlingera. Sygnał VSYNC wskazuje, że wyświetlacz można odświeża się bez rozdarcia. Gdy SurfaceFlinger otrzyma sygnał VSYNC, przechodzi przez listę warstw, szukając nowych buforów. Jeśli SurfaceFlinger znajdzie nowego bufora, SurfaceFlinger pobiera bufor. w przeciwnym razie usługa SurfaceFlinger będzie kontynuowana. aby użyć wcześniej uzyskanego bufora. SurfaceFlinger musi zawsze wyświetlać coś, więc używa jednego bufora. Jeśli w warstwa zostanie zignorowana.

Po zebraniu wszystkich buforów widocznych warstw SurfaceFlinger pyta czyli w jaki sposób należy wykonać kompozycję. Jeśli typ kompozycji warstwy znaków HWC to kompozycja klienta, SurfaceFlinger łączy te warstwy. Następnie SurfaceFlinger przekazuje bufor wyjściowy do HWC.

Menedżer okien

WindowManager kontroluje obiekty window, które są kontenerami obiektów view. Obiekty okna są zawsze obsługiwane przez obiektów na powierzchni. OknoWindowManager nadzoruje cykl życia, zdarzenia związane z wejściem i skupieniem, orientację ekranu, przejścia, animacje, pozycję, transformacje, kolejność i wiele innych aspektów okna. WindowManager wysyła wszystkie metadane okna do SurfaceFlingera, aby ten mógł wykorzystać te dane do tworzenia kompozycji powierzchni na wyświetlaczu.

Przed rotacją

Wiele nakładek sprzętowych nie obsługuje funkcji obracania (a nawet jeśli obsługuje, to kosztuje moc obliczeniową). Rozwiązaniem jest przekształcenie bufora przed przekazaniem go do SurfaceFlingera. Android obsługuje podpowiedź zapytania (NATIVE_WINDOW_TRANSFORM_HINT) w ANativeWindow, aby reprezentować najbardziej prawdopodobną transformację, która zostanie zastosowana do bufora przez SurfaceFlinger. Sterowniki GL mogą użyć tej wskazówki, aby wstępnie przekształcić bufor przed dotarciem do SurfaceFlinger, aby po pojawieniu się bufora przekształcenia.

Na przykład po otrzymaniu podpowiedzi o obróceniu o 90 stopni wygeneruj i zastosuj do bufora, aby zapobiec jego uruchamianiu poza koniec strony. Aby zapisać obrót przed obrotem. Szczegółowe informacje znajdziesz w interfejsie ANativeWindow zdefiniowanym w pliku system/core/include/system/window.h.