Zmniejsz wykorzystanie pamięci karty graficznej

W komponencie graficznym między interfejsem HAL kompozytora a SurfaceFlinger znajduje się bufor pamięci podręcznej na poziomie warstwy, który ma na celu zmniejszenie obciążenia związanego z wysyłaniem opisów plików przez interfejs IPC. Przed Androidem 14 ten bufor pamięci podręcznej nie był usuwany, gdy GraphicBufferProducer rozłącza się z SurfaceFlingerem GraphicBufferConsumer, na przykład gdy MediaCodec rozłącza się z SurfaceView. Od wersji 14 Androida możesz wymuszać czyszczenie tego buforowanego pamięci podręcznej, aby zmniejszyć zużycie pamięci graficznej.

Wybierz jedną z tych 2 opcji:

  • W przypadku urządzeń z Androidem 14 lub nowszym musisz zaimplementować nowe interfejsy Composer HAL w wersji 3.2. Ta opcja jest domyślnie włączona i najbardziej oszczędza pamięć. Urządzenia, które są aktualizowane do Androida 14 i nowszych, mogą też korzystać z tej opcji, aby w pełni wykorzystać pamięć.
  • W przypadku urządzeń z Androidem 14, na 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 opcja.

W 2 następnych sekcjach opisujemy, jak wdrożyć każdą z tych opcji.

Wdrażanie interfejsu Composer HAL 3.2

Aby w pełni korzystać z zalet pamięci bufora grafiki, musisz:

  1. Zaktualizuj implementację interfejsu HAL usługi Composer do wersji 3.2.
  2. Proces LayerCommand::bufferSlotsToClear polega na wyczyszczeniu wpisów pamięci podręcznej bufora wskazanych przez numery slotów na liście.

Interfejsy Composer HAL 3.2 związane z pamięcią podręczną grafiki, w tym LayerCommand:bufferSlotsToClear, znajdują się w LayerCommand.aidl-.

Włącz opcję zgodności wstecznej

Opcja zmniejszenia pamięci z zachowaniem zgodności wstecznej zastępuje rzeczywisty bufor w miejscu pamięci podręcznej za pomocą zastępczego bufora 1 x 1, co pozwala zaoszczędzić pamięć w przypadku wszystkich oczyszczonych miejsc, z wyjątkiem bieżącego aktywnego miejsca. Aby uzyskać częściowe korzyści związane z oszczędzaniem pamięci, włącz opcję zgodności wstecznej, ustawiając parametr surface_flinger.clear_slots_with_set_layer_buffer na true. Ten parametr sysprop znajduje się w pliku property_contexts.

Ustawienie tej właściwości sysprop wymaga, aby implementacja HAL w Composer poprawnie obsługiwała wiele poleceń setLayerBuffer dla tego samego poziomu w jednym cyklu prezentowania.

Włączenie opcji zgodności wstecznej powoduje:

  • W przypadku interfejsów AIDL HAL: SurfaceFlinger wysyła wiele instancji LayerCommand dla pojedynczej warstwy, z których każda ma pojedynczą wartość BufferCommand. Każdy element BufferCommand zawiera uchwyt bufora o wymiarach 1 x 1 i numer slotu bufora pamięci podręcznej, który należy wyczyścić.

  • W przypadku interfejsów HIDL HAL: SurfaceFlinger wysyła wiele poleceń SELECT_DISPLAY, SELECT_LAYER, SET_BUFFER. Te polecenia zawierają element zastępczy 1 x 1, identyfikator bufora i numer slotu pamięci podręcznej, który należy wyczyścić.

Opcja zgodności wstecznej może spowodować awarię interfejsu HAL usługi Composer na niektórych urządzeniach. Aby rozwiązać ten problem, możesz zmodyfikować interfejs HAL usługi Composer. Kod kontrolujący to działanie:

Testowanie zużycia pamięci przez pamięć podręczną bufora

Testy nie mogą zweryfikować, czy sloty pamięci podręcznej są czyszczone przez implementacje HAL. Możesz jednak śledzić wykorzystanie bufora graficznego za pomocą narzędzi do debugowania. Podczas monitorowania zauważysz, że w sytuacjach, gdy w YouTube szybko uruchamiasz i zatrzymujesz różne filmy, 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 ze starszymi wersjami. Nie powinno to jednak być uznawane za wystarczające do przetestowania odpowiedniej funkcji, ponieważ niektóre urządzenia przechodzą takie testy VTS, ale w rzeczywistych zastosowaniach kończą się niepowodzeniem.

W przypadku nowych testów VTS kliknij te linki: