SurfaceFlinger akceptuje bufory, tworzy bufory i wysyła je do wyświetlacza. WindowManager udostępnia SurfaceFlingerowi bufory i metadane okna, których SurfaceFlinger używa do łączenia powierzchni z wyświetlaczem.
SurfaceFlinger
SurfaceFlinger może akceptować bufory na 2 sposoby: za pomocą BufferQueue i SurfaceControl lub za pomocą ASurfaceControl.
Jedną z metod, za pomocą której SurfaceFlinger akceptuje bufory, jest BufferQueue i SurfaceControl. Gdy aplikacja pojawia się na pierwszym planie, prosi o bufory WindowManagera. Następnie WindowManager prosi o warstwę z SurfaceFlinger. Warstwa to połączenie powierzchni zawierającej kolejkę buforową i elementu sterującego powierzchnią zawierającego metadane warstwy, takie jak ramka wyświetlania. SurfaceFlinger tworzy warstwę i przesyła ją do WindowManagera. Następnie WindowManager wysyła powierzchnię do aplikacji, ale zachowuje kontroler powierzchni, aby móc 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. Obiekt ASurfaceControl jest powiązany z poziomem, który aplikacje aktualizują za pomocą transakcji ASurfaceTransactions. 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 ją utworzyć jako element podrzędny interfejsu 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 transakcjach, które zostały przedstawione, takie jak czas blokady, czasy pozyskania i poprzednia bariera uwalniania, do aplikacji 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ż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żyć bez zerwania. 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 pobranego. SurfaceFlinger musi zawsze coś wyświetlać, więc pozostaje w jednym buforze. 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 kompozytor (HWC), jak powinna przebiegać kompozycja. Jeśli typ kompozycji warstwy znaków HWC to kompozycja klienta, SurfaceFlinger łączy te warstwy. Następnie SurfaceFlinger przekazuje bufor wyjściowy do HWC.
WindowManager
OknoManager kontroluje obiekty okna, które są kontenerami dla obiektów widoku. Obiekty okna są zawsze oparte na obiektach 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 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ć najbardziej prawdopodobną 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 te czynności przed rotacją. Szczegółowe informacje znajdziesz w definicji interfejsu ANativeWindow
w pliku system/core/include/system/window.h
.