W stosie graficznym pamięć podręczna bufora na warstwę znajduje się pomiędzy Composer HAL i SurfaceFlinger, aby zmniejszyć obciążenie związane z wysyłaniem deskryptorów plików przez IPC. Przed systemem Android 14 ta pamięć podręczna bufora nie była czyszczona, gdy GraphicBufferProducer
rozłącza się z SurfaceFlinger GraphicBufferConsumer
, na przykład gdy MediaCodec jest odłączany od SurfaceView. Począwszy od Androida 14, możesz wymusić czyszczenie tej pamięci podręcznej bufora, aby zmniejszyć zużycie pamięci graficznej.
Wybierz jedną z dwóch poniższych opcji:
- W przypadku urządzeń uruchamianych z systemem Android 14 i nowszym należy zaimplementować nową wersję API Composer HAL 3.2. Ta opcja jest domyślnie włączona i oszczędza najwięcej pamięci. Urządzenia aktualizujące do wersji 14 i nowszej również mogą skorzystać z tej opcji, aby uzyskać korzyści z pełnej pamięci.
- W przypadku urządzeń aktualizujących się do systemu Android 14, na których nie chcesz implementować interfejsu API Composer HAL 3.2, możesz włączyć opcję kompatybilności wstecznej. Ta opcja oszczędza prawie tyle samo pamięci, co poprzednia opcja.
W poniższych dwóch sekcjach wyjaśniono, jak wdrożyć każdą opcję.
Zaimplementuj interfejs API Composer HAL 3.2
Aby uzyskać pełne korzyści w zakresie pamięci bufora graficznego, musisz:
- Zaktualizuj implementację Composer HAL do wersji 3.2.
- Przetwórz
LayerCommand::bufferSlotsToClear
, usuwając wpisy pamięci podręcznej bufora wskazane przez numery gniazd znalezione 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ę kompatybilności wstecznej
Opcja redukcji pamięci zgodna wstecznie zastępuje rzeczywisty bufor w gnieździe pamięci podręcznej buforem zastępczym 1x1, co skutkuje oszczędnością pamięci we wszystkich usuniętych gniazdach, z wyjątkiem aktualnie aktywnego gniazda bufora. Aby uzyskać korzyści z częściowego oszczędzania pamięci, włącz opcję zgodności wstecznej, ustawiając parametr sysprop surface_flinger.clear_slots_with_set_layer_buffer
na true
. Ten sysprop znajduje się w pliku property_contexts
.
Ustawienie tego sysprop wymaga, aby implementacja Composer HAL poprawnie obsługiwała wiele poleceń setLayerBuffer
dla tej samej warstwy w jednym bieżącym cyklu.
Włączenie opcji kompatybilności wstecznej ma następujące skutki:
W przypadku AIDL HAL: SurfaceFlinger wysyła wiele instancji
LayerCommand
dla pojedynczej warstwy, każda z pojedyncząBufferCommand
. KażdeBufferCommand
zawiera uchwyt bufora zastępczego 1x1 i numer gniazda bufora pamięci podręcznej, które należy wyczyścić.W przypadku warstw HAL HIDL: SurfaceFlinger wysyła wiele poleceń
SELECT_DISPLAY
,SELECT_LAYER
,SET_BUFFER
. Polecenia te zawierają uchwyt bufora zastępczego 1x1 i numer gniazda bufora pamięci podręcznej, które należy wyczyścić.
Opcja kompatybilności wstecznej może spowodować awarię Composer HAL na niektórych urządzeniach. Być może uda Ci się zmodyfikować warstwę HAL Composer, aby rozwiązać ten problem. Kod kontrolujący to zachowanie można znaleźć tutaj:
Sprawdź zużycie pamięci podręcznej bufora graficznego
Testy nie mogą sprawdzić, czy gniazda pamięci podręcznej są czyszczone przez implementacje HAL. Można jednak użyć narzędzi do debugowania, aby monitorować wykorzystanie bufora graficznego. Podczas monitorowania powinieneś zauważyć, że występuje mniej błędów związanych z brakiem pamięci w scenariuszach, w których wiele różnych filmów jest zatrzymywanych i uruchamianych w krótkim odstępie czasu w YouTube.
Dostępne są testy VTS, które sprawdzają, czy implementacja HAL jest funkcjonalnie zdolna do odbierania nowych wywołań API (HAL wersja 3.2 lub nowsza) lub wielu poleceń setLayerBuffer
w celu zapewnienia zgodności wstecznej. Nie należy jednak uważać tego za wystarczające testowanie poprawności funkcjonalności, ponieważ niektóre urządzenia przechodzą testy VTS, ale nie sprawdzają się w rzeczywistych przypadkach użycia.
Aby zapoznać się z nowymi testami VTS, przejdź do następujących łączy:
Kompatybilny z HIDL:
GraphicsComposerHidlCommandTest::SET_LAYER_BUFFER_multipleTimes
Kompatybilny z AIDL 3.1:
GraphicsComposerAidlCommandTest::SetLayerBufferMultipleTimes
AIDL 3.2:
GraphicsComposerAidlCommandV2Test::SetLayerBufferSlotsToClear