Obiekty na ekranie umożliwiają aplikacjom renderowanie obrazów, które mają być wyświetlane na ekranach. Interfejsy SurfaceHolder umożliwiają aplikacjom edytowanie i sterowanie powierzchniami.
Surface
Powierzchnia to interfejs, który umożliwia producentowi wymianę buforów z konsumentem.
Kolejka buforów dla powierzchni wyświetlania jest zwykle skonfigurowana pod kątem potrójnego buforowania. Bufory są przydzielane na żądanie, więc jeśli producent generuje je zbyt wolno, np. z częstotliwością 30 FPS na wyświetlaczu o częstotliwości 60 FPS, w kolejce mogą znajdować się tylko 2 przydzielone bufory.
Przydzielanie buforów na żądanie pomaga zminimalizować zużycie pamięci. W wyjściu dumpsys SurfaceFlinger
znajdziesz podsumowanie buforów powiązanych z każdą warstwą.
Większość klientów renderuje na powierzchniach za pomocą OpenGL ES lub Vulkan. Niektóre aplikacje renderują jednak obrazy na powierzchniach za pomocą kanwy.
Renderowanie na płótnie
Implementacja kanwy jest udostępniana przez bibliotekę graficzną Skia. Jeśli chcesz narysować prostokąt, wywołujesz interfejs Canvas API, który odpowiednio ustawia bajty w buforze. Aby mieć pewność, że bufor nie jest aktualizowany przez 2 klientów naraz lub zapisywany podczas wyświetlania, zablokuj dostęp do bufora. Aby pracować z blokadami na kanwie, użyj tych poleceń:
lockCanvas()
blokuje bufor do renderowania na procesorze i zwraca płótno do rysowania.unlockCanvasAndPost()
odblokowuje bufor i wysyła go do kompozytora.lockHardwareCanvas()
blokuje bufor do renderowania na GPU i zwraca płótno do rysowania.
Gdy producent po raz pierwszy poprosi o bufor z kolejki buforowej, zostanie on przydzielony i zainicjowany wartością 0. Inicjowanie jest konieczne, aby uniknąć przypadkowego udostępniania danych między procesami. Jeśli jednak używasz ponownie bufora, poprzednie treści są nadal obecne. Jeśli wielokrotnie wywołujesz metody lockCanvas()
i unlockCanvasAndPost()
bez rysowania czegokolwiek, producent przełącza się między wcześniej wyrenderowanymi klatkami.
Kod blokowania/odblokowywania powierzchni przechowuje odwołanie do wcześniej wyrenderowanego bufora. Jeśli podczas blokowania powierzchni określisz nieaktualny region, zostaną skopiowane nieaktualne piksele z poprzedniego bufora. Zazwyczaj buforem zarządza SurfaceFlinger lub HWC, ale ponieważ potrzebujemy tylko odczytu z bufora, nie trzeba czekać na wyłączny dostęp.
SurfaceHolder
SurfaceHolder to interfejs, którego system używa do udostępniania aplikacji prawa własności do powierzchni. Niektórzy klienci, którzy pracują z powierzchniami, potrzebują interfejsu SurfaceHolder, ponieważ interfejsy API służące do pobierania i ustawiania parametrów powierzchni są implementowane za pomocą SurfaceHolder. SurfaceView zawiera SurfaceHolder.
Większość komponentów, które współpracują z widokiem, korzysta z interfejsu SurfaceHolder. Niektóre inne interfejsy API, takie jak MediaCodec, działają na samej powierzchni.