SurfaceFlinger akceptuje bufory, komponuje je i wysyła do wyświetlacza. WindowManager
udostępnia SurfaceFlingerowi bufory i metadane okna, których używa do łączenia powierzchni z wyświetlaczem.
SurfaceFlinger
SurfaceFlinger może przyjmować bufory na 2 sposoby: za pomocą BufferQueue i SurfaceControl
lub za pomocą ASurfaceControl
.
SurfaceFlinger akceptuje bufory za pomocą kolejki buforów i SurfaceControl
. Gdy aplikacja przechodzi na pierwszy plan, prosi o bufory z WindowManager
. WindowManager
wysyła żądanie o warstwę do SurfaceFlinger. Warstwa to połączenie powierzchni zawierającej kolejkę buforową oraz instancji SurfaceControl
, która zawiera metadane warstwy, takie jak ramka wyświetlania.
SurfaceFlinger tworzy warstwę i wysyła ją do WindowManager
. WindowManager
przesyła powierzchnię do aplikacji, ale zachowuje instancję SurfaceControl
, aby manipulować wyglądem aplikacji na ekranie.
Android 10 dodaje ASurfaceControl
, co jest kolejnym sposobem, w jaki SurfaceFlinger może akceptować bufory. ASurfaceControl
łączy instancję powierzchni i SurfaceControl
w jeden pakiet transakcji, który jest wysyłany do SurfaceFlinger. ASurfaceControl
jest powiązany z poziomem, który aplikacje aktualizują za pomocą instancji ASurfaceTransaction
. Aplikacje otrzymują informacje o instancjach ASurfaceTransaction
za pomocą wywołań zwrotnych, które przekazują ASurfaceTransactionStats
z informacjami takimi 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 |
Owija SurfaceControl i umożliwia aplikacji tworzenie instancji SurfaceControl , które odpowiadają elementom na wyświetlaczu.Może być tworzony jako element podrzędny ANativeWindow lub jako element podrzędny innej instancji ASurfaceControl . |
ASurfaceTransaction |
Owija Transaction , aby umożliwić klientowi edytowanie właściwości opisowych warstwy, takich jak geometria, i wysyła zaktualizowane bufory do SurfaceFlinger. |
ASurfaceTransactionStats
| Wysyła do aplikacji informacje o prezentowanych transakcjach, takie jak czas blokady, czasy pozyskania i poprzednia bariera uwalniania, za pomocą zarejestrowanego wcześniej wywołania zwrotnego. |
Aplikacje mogą przesyłać bufory w dowolnym momencie, ale usługa SurfaceFlinger budzi się tylko po to, aby zaakceptować bufory między odświeżeniami ekranu, które mogą się różnić w zależności od urządzenia. Pozwala to zminimalizować wykorzystanie pamięci i uniknąć widocznego 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że być odświeżany bez rozrywania obrazu. Gdy SurfaceFlinger otrzyma sygnał VSync, przejdzie przez listę warstw, szukając nowych buforów. Jeśli SurfaceFlinger znajdzie nowy bufor, użyje go. W przeciwnym razie będzie nadal używać wcześniej nabytego bufora. SurfaceFlinger musi zawsze wyświetlać coś, więc używa jednego bufora. Jeśli w warstwie nie ma żadnych przesłanych buforów, warstwa jest ignorowana.
Gdy SurfaceFlinger zbierze wszystkie bufory dla widocznych warstw, pyta sprzętowy komponent kompozytorski (HWC), jak powinna przebiegać kompozycja. Jeśli kompozycja warstwy znaków wodnych w ramach HWC jest kompozycją klienta, SurfaceFlinger łączy te warstwy. Następnie SurfaceFlinger przekazuje bufor wyjściowy do HWC.
WindowManager
WindowManager
kontroluje obiekty Window
, które są kontenerami dla obiektów View
. Obiekty Window
są zawsze tworzone na podstawie obiektów Surface
.
WindowManager
nadzoruje cykle życia, zdarzenia wprowadzania i skupienia, orientację ekranu, przejścia, animacje, położenie, transformacje, kolejność i wiele innych aspektów okna. WindowManager
wysyła wszystkie metadane okna do usługi SurfaceFlinger, aby mogła ona wykorzystać te dane do łączenia powierzchni na wyświetlaczu.
Przed rotacją
Wiele nakładek sprzętowych nie obsługuje funkcji obracania (a nawet jeśli obsługuje, to kosztuje to 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ć najprawdopodobniejszą transformację, która zostanie zastosowana do bufora przez SurfaceFlinger. Sterowniki GL mogą używać tego podpowiedzi do wstępnej transformacji bufora, zanim dotrze on do SurfaceFlingera, aby po jego otrzymaniu był już prawidłowo przekształcony.
Jeśli na przykład otrzymasz wskazówkę, aby obrócić o 90 stopni, wygeneruj i zastosuj do bufora odpowiednią matrycę, aby nie kończyła się na krawędzi strony. Aby zaoszczędzić energię, wykonaj tę czynność przed rotacją. Szczegółowe informacje znajdziesz w definicji interfejsu ANativeWindow
w pliku system/core/include/system/window.h
.