SurfaceFlinger i WindowManager

SurfaceFlinger akceptuje bufory, tworzy 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.

SurfaceFlinger

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

Jednym ze sposobów, w jaki SurfaceFlinger akceptuje bufory, są BufferQueue i SurfaceControl. Kiedy aplikacja pojawia się na pierwszym planie, żąda buforów od WindowManager . Następnie WindowManager żąda warstwy od SurfaceFlinger. Warstwa jest kombinacją powierzchni zawierającej BufferQueue i SurfaceControl zawierającej metadane warstwy, takie jak ramka wyświetlacza. SurfaceFlinger tworzy warstwę i wysyła ją do WindowManager. Następnie WindowManager wysyła powierzchnię do aplikacji, ale utrzymuje SurfaceControl w celu manipulowania wyglądem aplikacji na ekranie.

Android 10 dodaje funkcję ASurfaceControl, która jest kolejnym sposobem, w jaki SurfaceFlinger może akceptować bufory. ASurfaceControl łączy powierzchnię i SurfaceControl w jeden pakiet transakcji, który jest wysyłany do SurfaceFlinger. Element ASurfaceControl jest powiązany z warstwą, którą aplikacje aktualizują za pośrednictwem ASurfaceTransactions. Następnie aplikacje uzyskują informacje o ASurfaceTransactions poprzez wywołania zwrotne, które przekazują ASurfaceTransactionStats zawierające informacje, takie jak czas zatrzasku, czas uzyskania itd.

Poniższa tabela zawiera więcej szczegółów na temat ASurfaceControl i powiązanych z nim komponentów.

Część Opis
Kontrola powierzchni Zawija SurfaceControl i umożliwia aplikacji tworzenie SurfaceControls odpowiadających warstwom na wyświetlaczu.

Można go utworzyć jako element podrzędny ANativeWindow lub jako element podrzędny innego ASurfaceControl.
Transakcja ASurface Zawija transakcję, aby umożliwić klientowi edycję właściwości opisowych warstwy, takich jak geometria, i wysyła zaktualizowane bufory do SurfaceFlinger.
Statystyki transakcji powierzchniowych Wysyła informacje o przedstawionych transakcjach, takie jak czas zatrzasku, czasy nabycia i bariera poprzedniego wydania, do aplikacji za pośrednictwem wcześniej 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 ekranu, które mogą się różnić w zależności od urządzenia. Minimalizuje to zużycie pamięci i pozwala uniknąć widocznego rozdarcia ekranu, które może wystąpić podczas aktualizacji wyświetlacza w połowie odświeżania.

Gdy wyświetlacz znajduje się 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 odbierze sygnał VSYNC, SurfaceFlinger przegląda listę warstw w poszukiwaniu nowych buforów. Jeśli SurfaceFlinger znajdzie nowy bufor, SurfaceFlinger nabędzie bufor; jeśli nie, SurfaceFlinger nadal korzysta z wcześniej nabytego bufora. SurfaceFlinger musi zawsze coś wyświetlać, więc zawiesza się w jednym buforze. Jeśli na warstwie nie przesłano nigdy żadnych buforów, warstwa ta zostanie zignorowana.

Gdy SurfaceFlinger zgromadzi wszystkie bufory dla widocznych warstw, pyta program Hardware Composer (HWC), w jaki sposób należy wykonać kompozycję. Jeśli HWC oznaczy typ kompozycji warstwy jako kompozycję klienta, SurfaceFlinger skomponuje te warstwy. Następnie SurfaceFlinger przekazuje bufor wyjściowy do HWC .

Menedżer okien

WindowManager kontroluje obiekty okien , które są kontenerami na obiekty widoku . Obiekty okienne są zawsze wspierane przez obiekty powierzchniowe. WindowManager nadzoruje cykle życia, zdarzenia wejściowe i fokus, orientację ekranu, przejścia, animacje, położenie, transformacje, kolejność Z i wiele innych aspektów okna. WindowManager wysyła wszystkie metadane okna do SurfaceFlinger, dzięki czemu SurfaceFlinger może wykorzystać te dane do złożonych powierzchni na wyświetlaczu.

Obrót wstępny

Wiele nakładek sprzętowych nie obsługuje rotacji (a nawet jeśli tak, wiąże się to z kosztami mocy obliczeniowej); rozwiązaniem jest przekształcenie bufora, zanim dotrze do SurfaceFlinger. Android obsługuje wskazówkę dotyczącą zapytania ( NATIVE_WINDOW_TRANSFORM_HINT ) w ANativeWindow , która reprezentuje najbardziej prawdopodobną transformację, która ma zostać zastosowana do bufora przez SurfaceFlinger. Sterowniki GL mogą skorzystać z tej wskazówki, aby wstępnie przekształcić bufor, zanim dotrze do SurfaceFlinger, tak aby po dotarciu bufor został poprawnie przekształcony.

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