Zarządzanie buforem ramki klienta

Począwszy od Androida 13, nowe bufory ramki używane podczas tworzenia klienta są przydzielane za każdym razem, gdy zmienia się rozdzielczość wyświetlacza. Ta alokacja jest wykonywana przez SurfaceFlinger w następnym cyklu unieważniania po zmianie rozdzielczości.

Zarządzanie buforem ramki podczas przełączania rozdzielczości

Zmiany rozdzielczości występują w jednym z dwóch następujących scenariuszy:

  • Zdarzenie typu hotplug inicjowane przez program Hardware Composer (HWC), które występuje podczas przełączania z jednego wyświetlacza zewnętrznego na inny wyświetlacz zewnętrzny o innej rozdzielczości domyślnej.

    Podczas zdarzenia podłączania na gorąco uchwyty do starych buforów ramki są zwalniane po zwolnieniu starych danych wyświetlania.

  • Przełącznik trybu wyświetlania inicjowany przez SurfaceFlinger, który występuje, gdy użytkownik zmienia rozdzielczość za pomocą ustawień użytkownika lub aplikacja zmienia rozdzielczość za pomocą preferredDisplayModeId .

    Podczas przełączania trybu wyświetlania uchwyty do istniejących buforów ramki klienta są zwalniane przez SurfaceFlinger przed wywołaniem setActiveConfig lub setActiveConfigWithConstraints .

Aby uniknąć katastrofalnych problemów, takich jak fragmentacja pamięci, na urządzeniach, które nie rezerwują wystarczającej ilości pamięci dla starych i nowych buforów ramki, niezwykle ważne jest, aby HWC zaprzestała używania starych buforów ramki i zwolniła wszelkie uchwyty do tych buforów ramki, jak pokazano w następujących przypadkach:

Zwolnienie uchwytów umożliwia całkowite zwolnienie pamięci bufora ramki przed alokacją nowych buforów ramki, którą SurfaceFlinger wykonuje podczas następnego cyklu unieważniania .

Zalecenia dotyczące zarządzania buforem ramki

Jeśli HWC nie zwolni na czas uchwytów do starych buforów ramki, nowy przydział buforów ramki ma miejsce przed zwolnieniem starego bufora ramki. Może to spowodować katastrofalne problemy, gdy nowa alokacja nie powiedzie się z powodu fragmentacji lub innych problemów. Co gorsza, jeśli HWC w ogóle nie zwolni tych uchwytów, może wystąpić wyciek pamięci.

Aby uniknąć katastrofalnych błędów alokacji, postępuj zgodnie z poniższymi zaleceniami:

  • Jeśli HWC musi nadal używać buforów ramki starego klienta do czasu dostarczenia buforów ramki nowego klienta, niezwykle istotne jest zarezerwowanie wystarczającej ilości pamięci zarówno dla starego, jak i nowego bufora ramki i ewentualnie uruchomienie algorytmów defragmentacji przestrzeni pamięci bufora ramki.

  • Przydziel dedykowaną pulę pamięci dla buforów ramki, oddzieloną od reszty pamięci bufora graficznego. Jest to ważne, ponieważ pomiędzy zwolnieniem a ponownym przydzieleniem buforów ramki proces strony trzeciej może podjąć próbę przydzielenia pamięci graficznej. Jeśli bufor ramki wykorzystuje tę samą pulę pamięci graficznej i pamięć graficzna jest pełna, proces strony trzeciej może zająć pamięć graficzną wcześniej przydzieloną przez bufor ramki, pozostawiając w ten sposób niewystarczającą ilość pamięci do ponownego przydzielenia bufora ramki lub ewentualnie fragmentując przestrzeń pamięci .

Przetestuj zarządzanie buforem ramki

Producentom OEM zaleca się przetestowanie prawidłowego zarządzania pamięcią bufora ramki klienta na przełącznikach rozdzielczości dla ich urządzenia, zgodnie z poniższym opisem:

  • W przypadku zdarzeń typu hotplug wystarczy odłączyć i ponownie podłączyć dwa różne wyświetlacze o różnych rozdzielczościach.

  • W przypadku przełączników trybu użyj testu ModeSwitchingTestActivity CTS Verifier, aby zainicjować przełącznik trybu w celu przetestowania zachowania pamięci bufora ramki. Ten test może wizualnie zidentyfikować problemy, które są trudne do wykrycia programowo.