W stosie graficznym między Composer HAL a SurfaceFlinger znajduje się pamięć podręczna buforów na warstwę, która zmniejsza narzut związany z wysyłaniem deskryptorów plików przez IPC. Przed Androidem 14 system nie czyścił tej pamięci podręcznej bufora, gdy GraphicBufferProducer
odłączał się od GraphicBufferConsumer
SurfaceFlingera, np. gdy MediaCodec odłączał się od SurfaceView. Od Androida 14 możesz wymusić wyczyszczenie tej pamięci podręcznej bufora, aby zmniejszyć zużycie pamięci graficznej.
Wybierz jedną z tych opcji:
- W przypadku urządzeń z Androidem 14 lub nowszym musisz wdrożyć nowy interfejs API HAL Composera w wersji 3.2. Ta opcja jest domyślnie włączona i pozwala zaoszczędzić najwięcej pamięci. Urządzenia, które przechodzą na Androida 14 lub nowszego, również mogą używać tej opcji, aby w pełni wykorzystać zalety większej ilości pamięci.
- W przypadku urządzeń, które są aktualizowane do Androida 14 i w których nie chcesz wdrażać interfejsu Composer HAL 3.2 API, możesz włączyć opcję zgodności wstecznej. Ta opcja oszczędza niemal tyle pamięci co poprzednia.
W dwóch sekcjach poniżej znajdziesz opis wdrażania każdej z tych opcji.
Wdrażanie interfejsu Composer HAL 3.2 API
Aby w pełni korzystać z pamięci bufora graficznego, musisz:
- Zaktualizuj implementację Composer HAL do wersji 3.2.
- Przetwórz
LayerCommand::bufferSlotsToClear
, usuwając wpisy z pamięci podręcznej bufora wskazane przez numery gniazd znajdujące się na liście.
Interfejsy API Composer HAL 3.2 związane z pamięcią bufora graficznego, w tym LayerCommand::bufferSlotsToClear
, znajdują się w LayerCommand.aidl
.
Włącz opcję zgodną wstecznie
Opcja zmniejszenia pamięci zapewniająca zgodność wsteczną zastępuje rzeczywisty bufor w gnieździe pamięci podręcznej buforem zastępczym o rozmiarze 1 x 1. Pozwala to zaoszczędzić pamięć w przypadku wszystkich usuniętych miejsc, z wyjątkiem bieżącego aktywnego miejsca w buforze. Aby uzyskać częściowe korzyści związane z oszczędzaniem pamięci, włącz opcję zgodności wstecznej, ustawiając surface_flinger.clear_slots_with_set_layer_buffer
sysprop na true
. Ten sysprop znajduje się w property_contexts
pliku.
Ustawienie tej właściwości systemowej wymaga, aby implementacja HAL kompozytora prawidłowo obsługiwała wiele poleceń setLayerBuffer
dla tej samej warstwy w jednym cyklu prezentacji.
Włączenie opcji zgodnej wstecznie ma te skutki:
W przypadku interfejsów HAL AIDL: SurfaceFlinger wysyła wiele instancji
LayerCommand
dla pojedynczej warstwy, z których każda ma pojedynczy elementBufferCommand
. Każdy elementBufferCommand
zawiera uchwyt bufora zastępczego o wymiarach 1 x 1 oraz numer miejsca w buforze pamięci podręcznej, które wymaga wyczyszczenia.W przypadku interfejsów HAL HIDL: SurfaceFlinger wysyła wiele poleceń
SELECT_DISPLAY
,SELECT_LAYER
,SET_BUFFER
. Te polecenia zawierają uchwyt bufora zastępczego o rozmiarze 1 x 1 i numer miejsca na bufor pamięci podręcznej, które wymaga wyczyszczenia.
Opcja zgodna wstecznie może powodować awarię warstwy HAL kompozytora na niektórych urządzeniach. Aby rozwiązać ten problem, możesz zmodyfikować warstwę HAL kompozytora. Kod kontrolujący to działanie znajdziesz tutaj:
Testowanie zużycia pamięci podręcznej bufora graficznego
Testy nie mogą sprawdzić, czy implementacje HAL czyszczą gniazda pamięci podręcznej. Możesz jednak użyć narzędzi do debugowania, aby monitorować wykorzystanie bufora graficznego. Podczas monitorowania możesz zauważyć mniej błędów związanych z brakiem pamięci w sytuacjach, w których wiele różnych filmów jest szybko zatrzymywanych i uruchamianych w YouTube.
Dostępne są testy VTS, które sprawdzają, czy implementacja HAL jest funkcjonalnie zdolna do odbierania nowych wywołań interfejsu API (HAL w wersji 3.2 lub nowszej) lub wielu poleceń setLayerBuffer
w przypadku implementacji zgodnej wstecz. Nie należy jednak uznawać tego za wystarczające testy prawidłowego działania, ponieważ niektóre urządzenia przechodzą te testy VTS, ale zawodzą w rzeczywistych zastosowaniach.
W przypadku nowych testów VTS zapoznaj się z tymi artykułami: