Warstwy i wyświetlacze to 2 elementy podstawowe przedstawiające pracę kompozycji i interakcji z ekranami.
Warstwy
Warstwa to najważniejszy element kompozycji. Warstwa jest
kombinacji elementu surface i wystąpienia
SurfaceControl
. Każda warstwa ma zestaw właściwości, które
określać sposób jego interakcji z innymi warstwami. Właściwości warstwy zostały opisane w tabeli poniżej.
Właściwość | Opis |
---|---|
Pozycyjne | Określa, gdzie warstwa ma się wyświetlać. Zawiera informacje takie jak położenie krawędzi warstwy i jej kolejność Z w stosunku do innych warstw (niezależnie od tego, czy znajdują się one przed innych warstw). |
Treść | Określa, jak treści wyświetlane na warstwie powinny być prezentowane w ograniczeniach zdefiniowanych przez właściwości pozycyjne. Zawiera informacje takie jak przycinanie (rozszerzanie części treści, aby wypełnić granice warstwy) i przekształcanie (wyświetlanie treści po obróceniu lub przewróceniu). |
Kompozycja | Określa sposób łączenia warstwy z innymi warstwami. Zawiera takie jak tryb mieszania i wartość alfa dla całej warstwy dla alfa komponowanie. |
Optymalizacja | Zawiera informacje, które nie są ściśle niezbędne do poprawnego zestawienia warstwy, ale może być używana przez urządzenie Hardware Composer (HWC) aby zoptymalizować kompozycję. Zawiera takie informacje jak: który obszar warstwy jest widoczny i która część została zaktualizowane od poprzedniej klatki. |
Wyświetlacze
Wyświetlanie to kolejna ważna jednostka kompozycji. System może mają kilka wyświetlaczy, i można dodawać lub usuwać wyświetlacze podczas normalnego działania systemu. Wyświetlacze są dodawane/usuwane na żądanie HWC lub na żądanie platformy. Urządzenie HWC prosi o dodanie lub usunięcie wyświetlaczy, gdy wyświetlacz zewnętrzny jest podłączany lub odłączany od urządzenia. Jest to nazywane hotpluggingiem. Klienci proszą o wirtualne wyświetlacze, których zawartość jest renderowana do bufora poza ekranem zamiast na fizyczny wyświetlacz.
Wyświetlacze wirtualne
SurfaceFlinger obsługuje wewnętrzny wyświetlacz (wbudowany w telefon lub tablet), wyświetlacze zewnętrzne. (np. telewizor podłączony przez HDMI) i co najmniej jeden wyświetlacz wirtualny. które udostępniają w systemie skomponowane dane wyjściowe. Ekrany wirtualne można wykorzystać do nagrywania ekranu lub wysyłania go przez sieć. Wygenerowane klatki dla wyświetlacza wirtualnego są zapisywane w BufferQueue.
Wyświetlacze wirtualne mogą korzystać z tego samego zestawu warstw co wyświetlacz główny (zbiór warstw) lub mieć własny zestaw. Nie ma systemu VSYNC dla wyświetlacza wirtualnego, więc funkcja VSYNC dla wyświetlacza wewnętrznego wyzwala kompozycję i wyświetlacze.
W przypadku implementacji HWC, które je obsługują, wyświetlacze mogą być komponowane z użyciem technologii OpenGL ES (GLES), HWC lub zarówno GLES, jak i HWC. W nieobsługiwanych implementacjach wyświetlacze wirtualne są zawsze skomponowane za pomocą funkcji GLES.
Studium przypadku: zapis ekranu
Polecenie screenrecord
umożliwia użytkownikowi:
rejestruj wszystko, co pojawia się na ekranie, jako plik .mp4
dysku. Aby to zaimplementować, system odbiera złożone klatki z SurfaceFlingera, zapisuje je w enkoderze wideo, a potem zapisuje zakodowane dane wideo w pliku. Kodek wideo jest zarządzany przez osobny proces (mediaserver
), więc duże bufory graficzne muszą się przemieszczać w systemie. Dlatego celem jest nagrywanie filmów z szybkością 60 kl./s
w pełnej rozdzielczości. Kluczem do sprawnego działania jest kolejka buforowa.
Klasa MediaCodec
umożliwia aplikacji dostarczanie danych jako surowych bajtów w buforach lub za pomocą powierzchni. Gdy screenrecord
prosi o dostęp do filmu
proces mediaserver
tworzy BufferQueue, łączy
na stronę konsumenta, a potem
zwraca stronę producenta
screenrecord
.
Narzędzia screenrecord
prosi SurfaceFlingera o utworzenie wirtualnego wyświetlacza, który odzwierciedla wyświetlacz główny (czyli ma te same warstwy), i kieruje dane do wyświetlacza, który pochodzi z procesu mediaserver
. W tym przypadku SurfaceFlinger jest producentem.
na buforach, a nie na konsumenta.
Po zakończeniu konfiguracji screenrecord
uruchamia się, gdy pojawiają się zakodowane dane. W miarę rysowania ich bufory wędrują do SurfaceFlinger,
który umieszcza je w jednym buforze, który jest przesyłany bezpośrednio do filmu.
w procesie mediaserver
. Pełne klatki nigdy nie są widoczne w procesie screenrecord
. Wewnętrznie
Proces mediaserver
ma własny sposób przenoszenia buforów wokół niego
przekazuje dane za pomocą uchwytu, minimalizując narzut.
Studium przypadku: symulacja ekranów dodatkowych
WindowManager może poprosić SurfaceFlinger o utworzenie widocznej warstwy, dla której SurfaceFlinger jest konsumentem BufferQueue. Możesz też zapytać SurfaceFlinger, aby utworzyć wyświetlacz wirtualny, w której rolę odgrywa SurfaceFlinger. producent BufferQueue.
Jeśli połączysz wyświetlacz wirtualny z widoczną warstwą, powstanie zamknięta pętla, w której złożony ekran będzie widoczny w oknie. To okno jest teraz częścią zrejestrowanego wyjścia, więc po następnym odświeżeniu złożony obraz w oknie będzie zawierać również zawartość okna. Aby zobaczyć, jak to działa, w sekcji Ustawienia włącz Opcje programisty, wybierz Symuluj wyświetlacze dodatkowe i włącz okno. Aby zobaczyć
dodatkowe ekrany w działaniu, użyj screenrecord
, aby zarejestrować działanie
po włączeniu odtwarzania klatka po klatce.