Warstwy i wyświetlacze

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.