Warstwy i wyświetlacze to dwa prymitywy, które reprezentują kompozycję i interakcje z wyświetlaczem.
Warstwy
Warstwa to najważniejszy element kompozycji. Warstwa to połączenie powierzchni i wystąpienia SurfaceControl
. Każda warstwa ma zestaw właściwości, które określają jej interakcje 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ć. Obejmuje informacje takie jak pozycje krawędzi warstwy i jej kolejność Z względem innych warstw (czy ma być z przodu, czy z tyłu innych warstw). |
Treść | Określa, jak zawartość wyświetlana w warstwie powinna być prezentowana w granicach zdefiniowanych przez właściwości pozycjonowania. Zawiera informacje takie jak przycinanie (rozszerzanie części treści w celu wypełnienia granic warstwy) i przekształcanie (wyświetlanie treści po obróceniu lub przewróceniu). |
Kompozycja | Określa sposób łączenia warstwy z innymi warstwami. Obejmuje informacje takie jak tryb mieszania i wartość alfa na poziomie warstwy na potrzeby kompozycji alfa. |
Optymalizacja | Zawiera informacje, które nie są niezbędne do prawidłowego złożenia warstwy, ale mogą być używane przez urządzenie komponowania sprzętowego (HWC) do optymalizacji procesu komponowania. Zawiera informacje takie jak widoczny obszar warstwy i to, która część warstwy została zaktualizowana od poprzedniego kadru. |
Wyświetlacze
Wyświetlanie to kolejna ważna jednostka kompozycji. System może mieć wiele wyświetlaczy i wyświetlaczy, które można dodawać lub usuwać 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, a nie na fizyczny wyświetlacz.
Wirtualne wyświetlacze
SurfaceFlinger obsługuje wyświetlacz wewnętrzny (wbudowany w telefon lub tablet), wyświetlacze zewnętrzne (np. telewizor podłączony przez HDMI) i 1 lub więcej wyświetlaczy wirtualnych, dzięki którym w systemie są dostępne komponowane wyjścia. Ekrany wirtualne można wykorzystać do nagrywania ekranu lub wysyłania go przez sieć. Ramki wygenerowane dla wyświetlacza wirtualnego są zapisywane w kole buforowej.
Wyświetlacze wirtualne mogą korzystać z tego samego zestawu warstw co wyświetlacz główny (zbiór warstw) lub mieć własny zestaw. Wyświetlacz wirtualny nie ma synchronizacji pionowej, więc synchronizowanie pionowe wyświetlacza wewnętrznego powoduje kompozycję wszystkich wyświetlaczy.
W implementacjach HWC, które je obsługują, wirtualne wyświetlacze mogą być złożone za pomocą OpenGL ES (GLES), HWC lub obu tych technologii. W implementacjach, które nie obsługują tej funkcji, wyświetlacze wirtualne są zawsze złożone za pomocą biblioteki GLES.
Studium przypadku: screenrecord
Polecenie screenrecord
pozwala użytkownikowi nagrywać wszystko, co pojawia się na ekranie, w pliku .mp4
na 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. Aby to utrudnić, celem jest nagrywanie filmów z szybkością 60 klatek na sekundę 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 kodera wideo, proces mediaserver
tworzy kolejkę buforową, łączy się z konsumentem, a następnie przekazuje stronie producenta z powrotem do screenrecord
jako powierzchnię.
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 buforów, a nie ich konsumentem.
Po zakończeniu konfiguracji aktywator screenrecord
wyzwala się, gdy pojawią się zakodowane dane. W miarę wyświetlania aplikacji bufory te trafiają do usługi SurfaceFlinger, która umieszcza je w pojedynczym buforze, który w ramach procesu mediaserver
jest wysyłany bezpośrednio do kodera wideo. Pełne klatki nigdy nie są widoczne w procesie screenrecord
. Wewnętrznie proces mediaserver
ma własny sposób przemieszczania buforów, który umożliwia również przekazywanie danych za pomocą uchwytu, co minimalizuje obciążenie.
Studium przypadku: symulacja ekranów dodatkowych
WindowManager może poprosić SurfaceFlingera o utworzenie widocznej warstwy, w której SurfaceFlinger działa jako odbiorca kolejki buforowej. Można też poprosić SurfaceFlingera o utworzenie wirtualnego wyświetlacza, w którym SurfaceFlinger działa jako producent kolejki buforowej.
Gdy połączysz wyświetlacz wirtualny z widoczną warstwą, w oknie pojawi się skomponowana pętla. To okno jest teraz częścią złożonego 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ć działanie wyświetlaczy dodatkowych, użyj screenrecord
, aby zarejestrować proces włączania wyświetlacza, a następnie odtworzyć go klatka po klatce.