Warstwy i wyświetlenia

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.