SurfaceFlinger i WindowManager

Usługa SurfaceFlinger akceptuje bufory, tworzy z nich kompozycje i wysyła je na wyświetlacz. WindowManager udostępnia usłudze SurfaceFlinger bufory i metadane okna, których usługa SurfaceFlinger używa 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 żą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.

W Androidzie 10 dodano ASurfaceControl, czyli kolejny sposób, w jaki SurfaceFlinger może akceptować bufory. ASurfaceControl łączy powierzchnię i instancję SurfaceControl w jeden pakiet transakcji, który jest wysyłany do SurfaceFlingera. 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, takie jak czas zatrzaskiwania, czas uzyskiwania dostępu itp.

W tabeli poniżej znajdziesz więcej informacji o ASurfaceControl i jego powiązanych komponentach:

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

Może być tworzony jako element podrzędny komponentu ANativeWindow lub innej instancji ASurfaceControl.
ASurfaceTransaction Zawiera Transaction, aby umożliwić klientowi edytowanie opisowych właściwości 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 wyświetlacz może być odświeżany bez rozrywania obrazu. Gdy SurfaceFlinger otrzyma sygnał VSync, przechodzi przez listę warstw w poszukiwaniu nowych buforów. Jeśli usługa SurfaceFlinger znajdzie nowy bufor, przejmuje go. 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, warstwa jest ignorowana.

Gdy SurfaceFlinger zbierze wszystkie bufory widocznych warstw, pyta Hardware Composer (HWC), jak ma przebiegać kompozycja. 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 przedstawić najbardziej prawdopodobną transformację, która zostanie zastosowana do bufora przez SurfaceFlinger. 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.