Surface i SurfaceHolder

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ń:

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()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.