W stosie graficznym między Composer HAL a SurfaceFlinger znajduje się pamięć podręczna buforów na warstwę, która zmniejsza obciążenie związane z wysyłaniem deskryptorów plików przez IPC. W Androidzie 14 i starszych wersjach bufor pamięci podręcznej nie był czyszczony, gdy GraphicBufferProducer
rozłączał się z SurfaceFlingerem GraphicBufferConsumer
, np. gdy MediaCodec rozłączał się z 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 przejdą na Androida 14 lub nowszego, również mogą używać tej opcji, aby w pełni wykorzystać zalety pamięci.
- W przypadku urządzeń, które są aktualizowane do Androida 14 i w których nie chcesz implementować interfejsu Composer HAL 3.2 API, możesz włączyć opcję zgodności wstecznej. Ta opcja oszczędza prawie 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 zużycia pamięci, która jest zgodna wstecznie, zastępuje rzeczywisty bufor w gnieździe pamięci podręcznej buforem zastępczym o rozmiarze 1x1, co pozwala zaoszczędzić pamięć we wszystkich usuniętych gniazdach z wyjątkiem bieżącego aktywnego gniazda bufora. 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 pliku
property_contexts
.
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 parametrBufferCommand
zawiera uchwyt bufora zastępczego o rozmiarze 1x1 i numer miejsca na bufor pamięci podręcznej, które należy wyczyścić.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 1x1 i numer miejsca na bufor pamięci podręcznej, który należy wyczyścić.
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 gniazda pamięci podręcznej są czyszczone przez implementacje HAL. Możesz jednak użyć narzędzi do debugowania, aby monitorować wykorzystanie bufora graficznego. Podczas monitorowania powinieneś zauważyć, że w scenariuszach, w których w YouTube szybko zatrzymuje się i uruchamia wiele różnych filmów, występuje mniej błędów związanych z brakiem pamięci.
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 uważać tego za wystarczające testy prawidłowego działania, ponieważ niektóre urządzenia przechodzą te testy VTS, ale zawodzą w rzeczywistych przypadkach użycia.
W przypadku nowych testów VTS kliknij te linki:
Zgodność z HIDL:
GraphicsComposerHidlCommandTest::SET_LAYER_BUFFER_multipleTimes
Zgodność z AIDL 3.1:
GraphicsComposerAidlCommandTest::SetLayerBufferMultipleTimes
AIDL 3.2:
GraphicsComposerAidlCommandV2Test::SetLayerBufferSlotsToClear