Warstwy i wyświetlacze

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 tej tabeli:

Właściwość Opis
pozycjonowanie, 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ć na pierwszym planie, czy na drugim).
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 informacje takie jak tryb mieszania i wartość alfa dla warstwy w celu 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 sposobu wykonywania kompozycji. Zawiera informacje takie jak widoczny obszar warstwy i który fragment warstwy został zaktualizowany od poprzedniego kadru.

Wyświetlacze

Wyświetlanie to kolejna ważna jednostka kompozycji. System może mieć wiele wyświetlaczy, które można dodawać i usuwać podczas normalnej pracy systemu. Wyświetlacze są dodawane lub usuwane na żądanie HWC lub na żądanie frameworku. Urządzenie HWC prosi o dodanie lub usunięcie wyświetlaczy, gdy zewnętrzny wyświetlacz 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 do fizycznego wyświetlacza.

Wirtualne wyświetlacze

SurfaceFlingerobsługuje wyświetlacz wewnętrzny (wbudowany w telefon lub tablet), wyświetlacze zewnętrzne (np. telewizor podłączony przez HDMI) oraz co najmniej 1 wyświetlacz wirtualny, które udostępniają w systemie wyjście złożone. Ekrany wirtualne można wykorzystać do nagrywania ekranu lub wysyłania go przez sieć. Ramki wygenerowane dla wyświetlacza wirtualnego są zapisywane w kolejce buforowej.

Wyświetlacze wirtualne mogą korzystać z tych samych warstw co wyświetlacz główny (zbiór warstw) lub mieć własny zestaw warstw. Synchronizacja pionowa nie jest dostępna w przypadku wyświetlacza wirtualnego, więc synchronizacja pionowa 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ć po systemie. Aby zwiększyć trudność, celem jest nagrywanie filmów z częstotliwością 60 kl./s w pełnej rozdzielczości. Kluczem do sprawnego działania jest kolejka buforowa.

Klasa MediaCodec pozwala aplikacji dostarczać dane jako surowe bajty w buforach lub przez powierzchnię. Gdy screenrecord prosi o dostęp do kodera wideo, proces mediaserver tworzy kolejkę buforową, łączy się z konsumentem, a następnie przekazuje producentowi 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 konsumentem.

Po zakończeniu konfiguracji reguła screenrecord jest uruchamiana, gdy pojawiają się zakodowane dane. Gdy aplikacje wyświetlają obraz, ich bufory są przesyłane do SurfaceFlingera, który łączy je w jeden bufor, który jest wysyłany bezpośrednio do kodera wideo w procesie mediaserver. Pełne ramki nigdy nie są widoczne dla procesu 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: symulowanie ekranów dodatkowych

Okno 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 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ą 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łącz Opcje programistyUstawieniach, 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.