Platforma Androida oferuje różne interfejsy API do 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ętowej (HAL), na której są oparte te sterowniki. Zanim przejdziesz dalej, zapoznaj się z tymi terminami:
Canvas (element interfejsu API)Surface. Klasa Canvas ma metody do standardowego rysowania komputerowego map bitowych, linii, okręgów, prostokątów, tekstu itp. i jest powiązana z mapą bitową lub powierzchnią. Obszar roboczy to najprostszy sposób rysowania obiektów 2D na ekranie. Klasą bazową jest Canvas.
android.graphics.drawable.
Więcej informacji o elementach, które można przeciągnąć, i innych zasobach znajdziesz w artykule
Omówienie zasobów aplikacji.
android.opengl
i javax.microedition.khronos.opengles.Surface (element interfejsu API)Surface. Zamiast bezpośrednio używać klasy
Surface użyj klasy
SurfaceView
SurfaceView (element interfejsu API)View, który opakowuje obiekt Surface do rysowania i udostępnia metody do dynamicznego określania jego rozmiaru i formatu. Widok powierzchni umożliwia rysowanie niezależnie od wątku UI w przypadku operacji wymagających dużej ilości zasobów, takich jak gry lub podgląd z aparatu, ale w rezultacie zużywa więcej pamięci. Widok powierzchni obsługuje grafikę obszaru roboczego i OpenGL ES. Klasą bazową obiektu SurfaceView jest
SurfaceView.
R.style i poprzedzonych prefiksem 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 odbiera wywołania z obiektu nadrzędnego (patrz
ViewGroup), aby się narysować, i informuje obiekt nadrzędny
o preferowanym rozmiarze i lokalizacji, które mogą nie być respektowane przez
obiekt nadrzędny. Więcej informacji znajdziesz w artykule
View.
ViewGroup (element interfejsu API)android.widget, ale rozszerzają klasę ViewGroup.
android.widget. Window (element interfejsu API)Window
klasy abstrakcyjnej, który określa elementy okna ogólnego,
takie jak wygląd, tekst paska tytułu oraz lokalizacja i zawartość
menu. Okna dialogowe i aktywności używają implementacji klasy
Window do renderowania obiektu Window. Nie musisz implementować
klasy Window ani używać okien w swojej aplikacji.Deweloperzy aplikacji rysują obrazy na ekranie na 3 sposoby: za pomocą obszaru roboczego, OpenGL ES lub Vulkan.
Komponenty graficzne Androida
Niezależnie od tego, jakiego interfejsu API do renderowania używają deweloperzy, wszystko jest renderowane na powierzchni. Powierzchnia reprezentuje stronę producenta kolejki buforów, która jest często wykorzystywana przez SurfaceFlinger. Każde okno utworzone na platformie Androida jest oparte na powierzchni. Wszystkie widoczne renderowane powierzchnie są komponowane na wyświetlaczu przez SurfaceFlinger.
Ten diagram pokazuje, jak współpracują ze sobą kluczowe komponenty:

Rysunek 1. Sposób renderowania powierzchni.
Główne komponenty są opisane w kolejnych sekcjach.
Producenci strumienia obrazów
Producentem strumienia obrazów może być wszystko, co tworzy bufory graficzne do wykorzystania. Przykłady to OpenGL ES, Canvas 2D i dekodery wideo mediaserver.
Konsumenci strumienia obrazów
Najczęstszym konsumentem strumieni obrazów jest SurfaceFlinger, usługa systemowa, która wykorzystuje aktualnie widoczne powierzchnie i komponuje je na wyświetlaczu za pomocą informacji dostarczanych 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 komponowania grupy powierzchni.
Inne aplikacje OpenGL ES mogą również wykorzystywać strumienie obrazów, np. aplikacja aparatu, która wykorzystuje strumień obrazów podglądu z aparatu. Aplikacje inne niż GL mogą być również konsumentami, np. klasa ImageReader.
Hardware Composer
Warstwa abstrakcji sprzętu dla podsystemu wyświetlania. SurfaceFlinger może delegować niektóre zadania kompozycji do HWC, aby odciążyć OpenGL i GPU. SurfaceFlinger działa jak zwykły klient OpenGL ES. Gdy na przykład SurfaceFlinger aktywnie komponuje 1 lub 2 bufory w 3., używa OpenGL ES. Dzięki temu komponowanie zużywa mniej energii niż w przypadku, gdy wszystkie obliczenia wykonuje GPU.
Warstwa abstrakcji sprzętu Hardware Composer HAL wykonuje drugą połowę pracy i jest centralnym punktem całego renderowania grafiki w Androidzie. HWC musi obsługiwać zdarzenia, z których jednym jest VSync (drugim jest hotplug do obsługi HDMI typu plug-and-play).
Gralloc
Alokator pamięci graficznej (Gralloc) jest potrzebny do alokowania pamięci wymaganej przez producentów obrazów. Więcej informacji znajdziesz w artykułach BufferQueue i Gralloc.
Przepływ danych
Ten diagram przedstawia potok graficzny Androida:

Rysunek 2. Przepływ danych graficznych w Androidzie.
Obiekty po lewej stronie to renderery tworzące bufory graficzne, takie jak ekran główny, pasek stanu i interfejs systemowy. SurfaceFlinger to kompozytor, a HWC to kompozytor.
BufferQueue
Kolejki buforów zapewniają połączenie między komponentami graficznymi Androida. Są to 2 kolejki, które pośredniczą w stałym cyklu buforów od producenta do konsumenta. Gdy producenci przekazują swoje bufory, SurfaceFlinger odpowiada za komponowanie wszystkiego na wyświetlaczu.
Ten diagram ilustruje proces komunikacji BufferQueue:

Rysunek 3. Proces komunikacji BufferQueue.
BufferQueue zawiera logikę, która łączy producentów i konsumentów strumienia obrazów. Przykładami producentów obrazów są podglądy z aparatu generowane przez warstwę abstrakcji sprzętu aparatu lub gry OpenGL ES. Przykładami konsumentów obrazów są SurfaceFlinger lub inna aplikacja, która wyświetla strumień OpenGL ES, np. aplikacja aparatu wyświetlająca wizjer aparatu.
BufferQueue to struktura danych, która łączy pulę buforów z kolejką i używa komunikacji międzyprocesowej (IPC) Binder do przekazywania buforów między procesami. Interfejs producenta lub
to, co przekazujesz komuś, kto chce generować bufory graficzne, to
IGraphicBufferProducer (część SurfaceTexture).
BufferQueue jest często używany do renderowania na powierzchni i wykorzystywania za pomocą GL
Consumer, a także do innych zadań.
BufferQueue może działać w 3 różnych trybach:
Aby wykonać większość tej pracy, SurfaceFlinger działa jak zwykły klient OpenGL ES. Gdy na przykład SurfaceFlinger aktywnie komponuje 1 lub 2 bufory w 3., używa OpenGL ES.
Warstwa abstrakcji sprzętu Hardware Composer wykonuje drugą połowę pracy. Ta warstwa abstrakcji sprzętu jest centralnym punktem całego renderowania grafiki w Androidzie.