Warstwy i wyświetlacze

Warstwy i wyświetlacze to dwa prymitywy reprezentujące pracę nad kompozycją i interakcje ze sprzętem wyświetlającym.

Warstwy

Warstwa jest najważniejszą jednostką kompozycji. Warstwa jest kombinacją powierzchni i instancji SurfaceControl . Każda warstwa ma zestaw właściwości definiujących jej interakcję z innymi warstwami. Właściwości warstwy opisano w poniższej tabeli.

Nieruchomość Opis
Pozycyjny Określa miejsce wyświetlania warstwy. Zawiera informacje, takie jak położenie krawędzi warstwy i jej kolejność Z w stosunku do innych warstw (czy powinna znajdować się przed, czy za innymi warstwami).
Treść Określa, w jaki sposób zawartość wyświetlana na warstwie powinna być prezentowana w granicach określonych przez właściwości pozycyjne. Zawiera informacje, takie jak przycięcie (w celu rozwinięcia części zawartości w celu wypełnienia granic warstwy) i przekształcenie (aby wyświetlić obróconą lub odwróconą zawartość).
Kompozycja Określa sposób łączenia warstwy z innymi warstwami. Zawiera informacje, takie jak tryb mieszania i wartość alfa dla całej warstwy dla kompozycji alfa .
Optymalizacja Dostarcza informacji, które nie są absolutnie niezbędne do prawidłowego skomponowania warstwy, ale mogą zostać wykorzystane przez urządzenie Hardware Composer (HWC) w celu optymalizacji sposobu wykonywania kompozycji. Zawiera informacje, takie jak widoczny obszar warstwy i która część warstwy została zaktualizowana od czasu poprzedniej klatki.

Wyświetla

Wyświetlacz to kolejna ważna jednostka kompozycji. System może mieć wiele wyświetlaczy, a wyświetlacze można dodawać lub usuwać podczas normalnych operacji systemu. Wyświetlacze są dodawane/usuwane na żądanie HWC lub na żądanie struktury. Żądania urządzenia HWC dotyczące dodania lub usunięcia wyświetlaczy po podłączeniu lub odłączeniu wyświetlacza zewnętrznego od urządzenia, nazywa się to podłączaniem na gorąco . Klienci żądają wyświetlaczy wirtualnych , których zawartość jest renderowana do bufora poza ekranem, a nie do fizycznego wyświetlacza.

Wirtualne pokazy

SurfaceFlinger obsługuje wyświetlacz wewnętrzny (wbudowany w telefon lub tablet), wyświetlacze zewnętrzne (takie jak telewizor podłączony przez HDMI) oraz jeden lub więcej wyświetlaczy wirtualnych, które udostępniają w systemie złożone wyjście. Wirtualne wyświetlacze mogą służyć do nagrywania ekranu lub przesyłania ekranu przez sieć. Ramki wygenerowane dla wyświetlacza wirtualnego są zapisywane w kolejce BufferQueue.

Wirtualne wyświetlacze mogą dzielić ten sam zestaw warstw, co wyświetlacz główny (stos warstw) lub mieć własny zestaw. Nie ma VSYNC dla wyświetlacza wirtualnego, więc VSYNC dla wyświetlacza wewnętrznego wyzwala kompozycję dla wszystkich wyświetlaczy.

W implementacjach HWC, które je obsługują, wyświetlacze wirtualne można łączyć z OpenGL ES (GLES), HWC lub zarówno GLES, jak i HWC. W nieobsługujących implementacjach wyświetlacze wirtualne są zawsze komponowane przy użyciu GLES.

Studium przypadku: zapis ekranu

Polecenie screenrecord umożliwia użytkownikowi nagranie wszystkiego, co pojawi się na ekranie, w postaci pliku .mp4 na dysku. Aby to wdrożyć, system odbiera złożone klatki z SurfaceFlinger, zapisuje je do kodera wideo, a następnie zapisuje zakodowane dane wideo do pliku. Kodeki wideo są zarządzane przez oddzielny proces ( mediaserver ), więc duże bufory graficzne muszą przemieszczać się po systemie. Aby było to trudniejsze, celem jest nagranie wideo z szybkością 60 klatek na sekundę w pełnej rozdzielczości. Kluczem do wydajnego działania jest BufferQueue.

Klasa MediaCodec umożliwia aplikacji dostarczanie danych w postaci nieprzetworzonych bajtów w buforach lub za pośrednictwem powierzchni. Kiedy screenrecord żąda dostępu do kodera wideo, proces mediaserver tworzy kolejkę BufferQueue, łączy się ze stroną konsumenta, a następnie przekazuje stronę producenta z powrotem do screenrecord jako powierzchnię.

Następnie narzędzie screenrecord prosi SurfaceFlingera o utworzenie wirtualnego wyświetlacza, który będzie lustrzanym odbiciem głównego wyświetlacza (to znaczy ma te same warstwy) i kieruje go w celu wysłania na powierzchnię danych wyjściowych pochodzących z procesu mediaserver . W tym przypadku SurfaceFlinger jest producentem buforów, a nie konsumentem.

Po zakończeniu konfiguracji, gdy pojawią się zakodowane dane, zostanie uruchomiony screenrecord . Gdy aplikacje rysują, ich bufory są przesyłane do SurfaceFlinger, który łączy je w jeden bufor wysyłany bezpośrednio do kodera wideo w procesie mediaserver . Pełne klatki nigdy nie są widoczne w procesie screenrecord . Wewnętrznie proces mediaserver ma swój własny sposób przenoszenia buforów, który również przekazuje dane przez uchwyt, minimalizując obciążenie.

Studium przypadku: symuluj wyświetlacze dodatkowe

WindowManager może poprosić SurfaceFlingera o utworzenie widocznej warstwy, dla której SurfaceFlinger działa jako konsument BufferQueue. Można także poprosić SurfaceFlingera o utworzenie wirtualnego wyświetlacza, dla którego SurfaceFlinger pełni rolę producenta BufferQueue.

Jeśli podłączysz wirtualny wyświetlacz do widocznej warstwy, utworzy się zamknięta pętla, w której złożony ekran pojawi się w oknie. To okno jest teraz częścią złożonego wyniku, więc przy następnym odświeżeniu złożony obraz wewnątrz okna pokazuje również zawartość okna. Aby zobaczyć to w akcji, włącz Opcje programistyczne w Ustawieniach , wybierz Symuluj ekrany dodatkowe i włącz okno. Aby zobaczyć dodatkowe wyświetlacze w akcji, użyj screenrecord aby uchwycić czynność włączania wyświetlacza, a następnie odtwórz klatkę po klatce.