SurfaceFlinger akceptuje, komponuje i wysyła bufory 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 akceptowania buforów przez SurfaceFlinger jest użycie BufferQueue i SurfaceControl. Gdy aplikacja przechodzi na pierwszy plan, prosi o bufory WindowManagera. Następnie WindowManager prosi o warstwę z SurfaceFlinger. Warstwa to połączenie powierzchni zawierającej kolejkę buforową oraz 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 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 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 | Zawiera kontroler SurfaceControl i umożliwia aplikacji tworzenie kontrolerów SurfaceControl, które odpowiadają elementom na wyświetlaczu. Może być tworzony jako element potomny okna ANativeWindow lub innego kontrolera 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. |
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żaniem wyświetlacza. Czas odświeżania 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ż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 pobranego. 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 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 wprowadzania i skupienia, 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ć 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ł on 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 interfejsie ANativeWindow
zdefiniowanym w pliku system/core/include/system/window.h
.