SurfaceFlinger i WindowManager

SurfaceFlinger akceptuje, komponuje i wysyła bufory na wyświetlacz. WindowManager udostępnia usłudze SurfaceFlinger bufory i metadane okna, które SurfaceFlinger wykorzystuje do łączenia powierzchni na wyświetlaczu.

SurfaceFlinger

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

Jednym ze sposobów, w jaki SurfaceFlinger akceptuje bufory, jest BufferQueue i SurfaceControl. Gdy aplikacja przechodzi na pierwszy plan, wysyła do WindowManager żądanie buforów. WindowManager wysyła następnie żądanie warstwy do SurfaceFlingera. Warstwa to połączenie powierzchni, która zawiera BufferQueue, i instancji SurfaceControl, która zawiera metadane warstwy, takie jak ramka wyświetlania. SurfaceFlinger tworzy warstwę i wysyła ją do WindowManager. WindowManager następnie wysyła powierzchnię do aplikacji, ale zachowuje instancję SurfaceControl, aby manipulować wyglądem aplikacji na ekranie.

Od Androida 10 ASurfaceControl zapewnia inny sposób akceptowania buforów przez SurfaceFlinger. ASurfaceControl łączy powierzchnię i instancję SurfaceControl w jeden pakiet transakcji, który otrzymuje SurfaceFlinger. ASurfaceControl jest powiązany z warstwą, którą aplikacje aktualizują za pomocą instancji ASurfaceTransaction. Aplikacje otrzymują informacje o instancjach ASurfaceTransaction za pomocą wywołań zwrotnych, które przekazują ASurfaceTransactionStats zawierające informacje, np. czas zatrzaśnięcia lub czas uzyskania dostępu.

W tabeli poniżej znajdziesz opis ASurfaceControl i powiązanych z nim komponentów:

Komponent Opis
ASurfaceControl Zawiera SurfaceControl i umożliwia aplikacji tworzenie instancji SurfaceControl, które odpowiadają warstwom na wyświetlaczu.
Można ją utworzyć jako element podrzędny komponentu ANativeWindow lub innego komponentu ASurfaceControl.
ASurfaceTransaction Zawiera Transaction, aby umożliwić klientowi edytowanie właściwości opisowych warstwy, takich jak geometria, i wysyła zaktualizowane bufory do SurfaceFlingera.
ASurfaceTransactionStats Wysyła do aplikacji informacje o transakcjach, które zostały przedstawione, takie jak czas zatrzasku, czas uzyskania i poprzednia bariera zwalniania, za pomocą wstępnie zarejestrowanego wywołania zwrotnego.

Aplikacje mogą przesyłać bufory w dowolnym momencie, ale usługa SurfaceFlinger wznawia działanie tylko po to, aby przyjmować bufory między odświeżeniami wyświetlacza, które mogą się różnić w zależności od urządzenia. Minimalizuje to zużycie pamięci i zapobiega widocznym na ekranie rozrywaniu obrazu, które może wystąpić podczas aktualizacji wyświetlacza w trakcie odświeżania.

Gdy wyświetlacz jest między odświeżeniami, wysyła sygnał VSync do SurfaceFlinger. Sygnał VSync oznacza, że może odświeżać wyświetlacz bez rozrywania obrazu. Gdy SurfaceFlinger otrzyma sygnał VSync, przegląda listę warstw w poszukiwaniu nowych buforów. Jeśli znajdzie nowy bufor, SurfaceFlinger go przejmuje. W przeciwnym razie nadal używa wcześniej przejętego bufora. SurfaceFlinger musi zawsze coś wyświetlać, więc zachowuje jeden bufor. Jeśli w przypadku warstwy nigdy nie przesłano buforów, SurfaceFlinger ignoruje tę warstwę.

Gdy SurfaceFlinger zbierze wszystkie bufory widocznych warstw, pyta Hardware Composer (HWC), jak ma przeprowadzić kompozycję. Jeśli HWC oznacza typ kompozycji warstwy jako kompozycję klienta, SurfaceFlinger tworzy kompozycję tych warstw. Następnie usługa SurfaceFlinger przekazuje bufor wyjściowy do HWC.

WindowManager

WindowManager kontroluje obiekty Window, które są kontenerami obiektów View. Obiekty Window są zawsze obsługiwane przez obiekty Surface. WindowManager zarządza cyklami życia, zdarzeniami związanymi z wejściem i fokusem, orientacją ekranu, przejściami, animacjami, pozycją, przekształceniami, kolejnością osi Z i wieloma innymi aspektami okna. WindowManager wysyła wszystkie metadane okna do usługi SurfaceFlinger, aby mogła ona używać tych danych do komponowania powierzchni na wyświetlaczu.

Wstępna rotacja

Wiele nakładek sprzętowych nie obsługuje obracania (a nawet jeśli to robią, wymaga to mocy obliczeniowej). Rozwiązaniem jest przekształcenie bufora przed jego dotarciem do SurfaceFlingera. Android obsługuje wskazówkę dotyczącą zapytania (NATIVE_WINDOW_TRANSFORM_HINT) w ANativeWindow, aby reprezentować najbardziej prawdopodobną transformację, którą SurfaceFlinger zastosuje do bufora. Sterowniki GL mogą używać tej wskazówki do wstępnego przekształcenia bufora, zanim trafi on do SurfaceFlingera, dzięki czemu po dotarciu bufor będzie prawidłowo przekształcony.

Na przykład po otrzymaniu wskazówki, aby obrócić obraz o 90 stopni, wygeneruj i zastosuj macierz do bufora, aby zapobiec wyjściu obrazu poza koniec strony. Aby oszczędzać energię, zrób to przed obróceniem. Szczegółowe informacje znajdziesz w ANativeWindow interfejsie zdefiniowanym w system/core/include/system/window.h.