Platforma Android oferuje różne interfejsy API renderowania grafiki 2D i 3D, które współpracują z implementacjami sterowników graficznych producentów. Dlatego ważne jest, aby dobrze rozumieć, jak te interfejsy API działają na wyższym poziomie. Na tej stronie przedstawiamy warstwę abstrakcji sprzętu graficznego (HAL), na której są oparte te sterowniki. Zanim przejdziesz do tej sekcji, zapoznaj się z tymi terminami:
Canvas (element interfejsu API)Surface. Klasa Canvas ma metody standardowego rysowania na komputerze bitmap, linii, okręgów, prostokątów, tekstu itp. i jest powiązana z bitmapą lub powierzchnią. Obszar rysowania to najprostszy sposób rysowania obiektów 2D na ekranie. Klasa bazowa to Canvas.
android.graphics.drawable.
Więcej informacji o elementach rysowalnych i innych zasobach znajdziesz w artykule Omówienie zasobów aplikacji.
android.opengl
i javax.microedition.khronos.opengles
udostępniają funkcje OpenGL ES.Surface (element interfejsu API)Surface. Użyj klasy
SurfaceView
zamiast klasy
Surface.
SurfaceView (element interfejsu API)View, który otacza obiekt Surface do rysowania i udostępnia metody dynamicznego określania jego rozmiaru i formatu. Widok powierzchni umożliwia rysowanie niezależnie od wątku interfejsu, co jest przydatne w przypadku operacji wymagających dużej ilości zasobów, takich jak gry czy podgląd z kamery. Jednak w tym przypadku zużywana jest dodatkowa pamięć. Widok powierzchni obsługuje grafikę zarówno w przypadku płótna, jak i OpenGL ES. Klasą bazową obiektu SurfaceView jest SurfaceView.
R.style i poprzedzone symbolem Theme_.View (element interfejsu API)View jest klasą bazową większości komponentów układu ekranu aktywności lub okna dialogowego, takich jak pola tekstowe i okna. Obiekt View otrzymuje wywołania z obiektu nadrzędnego (patrz ViewGroup), aby się narysować, i informuje obiekt nadrzędny o preferowanym rozmiarze i położeniu, które mogą nie być respektowane przez obiekt nadrzędny. Więcej informacji znajdziesz w sekcji View.
ViewGroup (element interfejsu API)android.widget, ale rozszerzają klasę ViewGroup.
android.widget. Window (element interfejsu API)Window, która określa elementy ogólnego okna, takie jak wygląd, tekst na pasku tytułu oraz lokalizacja i zawartość menu. Okna i aktywności używają implementacji klasy Window do renderowania obiektu Window. Nie musisz implementować klasy Window ani używać okien w aplikacji.Deweloperzy aplikacji rysują obrazy na ekranie na 3 sposoby: za pomocą Canvas, OpenGL ES lub Vulkan.
Komponenty graficzne Androida
Niezależnie od tego, jakiego interfejsu API renderowania używają programiści, wszystko jest renderowane na powierzchni. Powierzchnia reprezentuje stronę producenta kolejki bufora, która jest często wykorzystywana przez SurfaceFlinger. Każde okno utworzone na platformie Android jest obsługiwane przez powierzchnię. Wszystkie widoczne powierzchnie są renderowane i łączone na wyświetlaczu przez SurfaceFlinger.
Ten diagram pokazuje, jak współpracują ze sobą kluczowe komponenty:

Rysunek 1. Jak renderowane są powierzchnie.
Główne komponenty są opisane w kolejnych sekcjach.
Producenci strumieni obrazów
Producentem strumienia obrazów może być dowolny element, który generuje bufory graficzne do wykorzystania. Przykłady to OpenGL ES, Canvas 2D i dekodery wideo serwera multimediów.
Odbiorcy strumienia obrazów
Najczęstszym odbiorcą strumieni obrazu jest SurfaceFlinger, czyli usługa systemowa, która wykorzystuje aktualnie widoczne powierzchnie i łączy je na wyświetlaczu za pomocą informacji dostarczonych przez menedżera okien. SurfaceFlinger to jedyna usługa, która może modyfikować zawartość wyświetlacza. SurfaceFlinger używa OpenGL i Hardware Composer (HWC) do tworzenia grupy powierzchni.
Strumienie obrazu mogą być też wykorzystywane przez inne aplikacje OpenGL ES, np. aplikację aparatu, która korzysta ze strumienia obrazu z podglądu kamery. Aplikacje inne niż GL mogą być również konsumentami, np. klasa ImageReader.
Kompozytor sprzętowy
Warstwa abstrakcji sprzętowej dla podsystemu wyświetlania. SurfaceFlinger może delegować niektóre zadania związane z komponowaniem do HWC, aby odciążyć OpenGL i procesor graficzny. SurfaceFlinger działa jak zwykły klient OpenGL ES. Gdy SurfaceFlinger aktywnie łączy jeden lub dwa bufory w trzeci, np. za pomocą interfejsu OpenGL ES. Dzięki temu kompozycja zużywa mniej energii niż w przypadku, gdy wszystkie obliczenia wykonuje GPU.
Warstwa HAL kompozytora sprzętowego wykonuje drugą połowę pracy i jest centralnym punktem wszystkich operacji renderowania grafiki w Androidzie. Sprzętowy kompozytor musi obsługiwać zdarzenia, z których jednym jest VSync (innym jest hotplug do obsługi HDMI typu plug-and-play).
Gralloc
Alokator pamięci graficznej (Gralloc) jest potrzebny do przydzielania pamięci wymaganej przez producentów obrazów. Więcej informacji znajdziesz w artykule BufferQueue i Gralloc.
Przepływ danych
Poniższy diagram przedstawia potok graficzny Androida:

Rysunek 2. Przepływ danych graficznych w Androidzie.
Obiekty po lewej stronie to renderery generujące bufory graficzne, takie jak ekran główny, pasek stanu i interfejs systemu. SurfaceFlinger to kompozytor, a HWC to kompozytor.
BufferQueue
Kolejki buforów stanowią połączenie między komponentami graficznymi Androida. Są to dwie kolejki, które pośredniczą w stałym cyklu buforów od producenta do konsumenta. Po przekazaniu buforów przez producentów SurfaceFlinger odpowiada za łączenie wszystkich elementów na wyświetlaczu.
Poniższy diagram ilustruje proces komunikacji BufferQueue:

Rysunek 3. Proces komunikacji BufferQueue.
BufferQueue zawiera logikę, która łączy producentów strumieni obrazów z konsumentami strumieni obrazów. Przykłady producentów obrazów to podglądy z aparatu generowane przez HAL aparatu lub gry OpenGL ES. Przykłady odbiorców obrazu to SurfaceFlinger lub inna aplikacja wyświetlająca strumień OpenGL ES, np. aplikacja aparatu wyświetlająca wizjer.
BufferQueue to struktura danych, która łączy pulę buforów z kolejką i wykorzystuje komunikację międzyprocesową (IPC) Binder do przekazywania buforów między procesami. Interfejs producenta, czyli to, co przekazujesz osobie, która chce generować bufory graficzne, to IGraphicBufferProducer (część SurfaceTexture). BufferQueue jest często używany do renderowania na Surface i używania z GL Consumer, a także do innych zadań.
Kolejka buforów może działać w 3 różnych trybach:
W większości przypadków SurfaceFlinger działa jak zwykły klient OpenGL ES. Gdy SurfaceFlinger aktywnie łączy jeden lub dwa bufory w trzeci, korzysta na przykład z OpenGL ES.
Drugą połowę pracy wykonuje HAL kompozytora sprzętowego. Ta warstwa HAL jest centralnym punktem wszystkich operacji renderowania grafiki w Androidzie.