SurfaceFlinger i WindowManager

SurfaceFlinger akceptuje bufory, komponuje bufory i wysyła bufory do wyświetlacza. WindowManager udostępnia SurfaceFlingerowi bufory i metadane okien, których SurfaceFlinger używa do łączenia powierzchni z wyświetlaczem.

Rzucanie powierzchni

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

Jednym ze sposobów, w jaki SurfaceFlinger akceptuje bufory, jest BufferQueue i SurfaceControl. Gdy aplikacja pojawia się na pierwszym planie, żąda buforów od WindowManager . WindowManager następnie żąda warstwy od SurfaceFlinger. Warstwa jest kombinacją powierzchni , która zawiera BufferQueue i SurfaceControl , która zawiera metadane warstwy, takie jak ramka wyświetlania. SurfaceFlinger tworzy warstwę i wysyła ją do WindowManagera. WindowManager następnie wysyła powierzchnię do aplikacji, ale zachowuje SurfaceControl, aby manipulować wyglądem aplikacji na ekranie.

Android 10 dodaje AsurfaceControl, który jest kolejnym sposobem, w jaki SurfaceFlinger może akceptować bufory. AsurfaceControl łączy powierzchnię i SurfaceControl w jeden pakiet transakcyjny, który jest wysyłany do SurfaceFlinger. AsurfaceControl jest skojarzony z warstwą, którą aplikacje aktualizują za pośrednictwem AsurfaceTransactions. Następnie aplikacje uzyskują informacje o AsurfaceTransactions za pośrednictwem wywołań zwrotnych, które przekazują AsurfaceTransactionStats zawierające informacje, takie jak czas zatrzasku, czas pozyskiwania i tak dalej.

Poniższa tabela zawiera więcej szczegółów na temat AsurfaceControl i skojarzonych z nim składników.

Składnik Opis
ASterowanie powierzchni Zawija SurfaceControl i umożliwia aplikacji tworzenie SurfaceControls, które odpowiadają warstwom na wyświetlaczu.

Może być utworzony jako element podrzędny ANativeWindow lub jako element podrzędny innego AsurfaceControl.
AsurfaceTransakcja Wraps Transaction, aby umożliwić klientowi edycję opisowych właściwości warstwy, takich jak geometria, i wysyła zaktualizowane bufory do SurfaceFlinger.
AsurfaceStatystyki transakcji Wysyła do aplikacji informacje o przedstawionych transakcjach, takie jak czas zatrzaśnięcia, czasy pozyskiwania i bariera poprzedniej wersji, za pośrednictwem wstępnie zarejestrowanego wywołania zwrotnego.

Chociaż aplikacje mogą przesyłać bufory w dowolnym momencie, SurfaceFlinger budzi się tylko w celu zaakceptowania buforów 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 widocznemu rozrywaniu ekranu, które może wystąpić podczas aktualizacji wyświetlacza w trakcie odświeżania.

Gdy wyświetlacz jest pomiędzy odświeżeniami, wysyła sygnał VSYNC do SurfaceFlinger. Sygnał VSYNC wskazuje, że wyświetlacz można odświeżyć bez rozrywania. Gdy SurfaceFlinger odbiera sygnał VSYNC, SurfaceFlinger przechodzi przez listę warstw w poszukiwaniu nowych buforów. Jeśli SurfaceFlinger znajdzie nowy bufor, SurfaceFlinger przejmuje bufor; jeśli nie, SurfaceFlinger nadal używa poprzednio nabytego bufora. SurfaceFlinger musi zawsze coś wyświetlać, więc trzyma się jednego bufora. Jeśli żadne bufory nigdy nie zostały przesłane do warstwy, warstwa jest ignorowana.

Gdy SurfaceFlinger zgromadzi wszystkie bufory dla widocznych warstw, zapyta on Hardware Composer (HWC), jak należy wykonać kompozycję. Jeśli HWC oznaczy typ kompozycji warstw jako kompozycję klienta, SurfaceFlinger połączy te warstwy. Następnie SurfaceFlinger przekazuje bufor wyjściowy do HWC .

Menedżer okien

WindowManager kontroluje obiekty okien , które są kontenerami dla obiektów widoku . Obiekty okien są zawsze wspierane przez obiekty powierzchni. WindowManager nadzoruje cykle życia, zdarzenia wejściowe i fokusowe, orientację ekranu, przejścia, animacje, położenie, przekształcenia, porządek Z i wiele innych aspektów okna. WindowManager wysyła wszystkie metadane okna do SurfaceFlinger, aby SurfaceFlinger mógł wykorzystać te dane do kompozytowych powierzchni na wyświetlaczu.

Obrót wstępny

Wiele nakładek sprzętowych nie obsługuje rotacji (a nawet jeśli tak, kosztuje to moc obliczeniową); rozwiązaniem jest przekształcenie bufora, zanim dotrze on do SurfaceFlinger. System Android obsługuje wskazówkę dotyczącą zapytania ( NATIVE_WINDOW_TRANSFORM_HINT ) w ANativeWindow , która reprezentuje najbardziej prawdopodobną transformację, która zostanie zastosowana do buforu przez SurfaceFlinger. Sterowniki GL mogą użyć tej wskazówki do wstępnego przekształcenia bufora, zanim dotrze on do SurfaceFlinger, tak aby po przybyciu bufora był poprawnie przekształcony.

Na przykład, gdy otrzymasz wskazówkę dotyczącą obrotu o 90 stopni, wygeneruj i zastosuj do bufora macierz, aby zapobiec jej wybieganiu poza koniec strony. Aby zaoszczędzić energię, wykonaj tę rotację wstępną. Aby uzyskać szczegółowe informacje, zobacz interfejs ANativeWindow zdefiniowany w pliku system/core/include/system/window.h .