Zarządzanie framebufferem klienta

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

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

Zmiany rozdzielczości mogą nastąpić w jednym z tych 2 przypadków:

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

    Podczas zdarzenia hotplug uchwyty do starych buforów ramki są zwalniane, gdy stare dane wyświetlacza są zwalniane.

  • Przełączanie trybu wyświetlania zainicjowane przez SurfaceFlinger, które następuje, gdy użytkownik zmieni rozdzielczość za pomocą ustawień użytkownika lub gdy aplikacja zmieni 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 funkcji setActiveConfig lub setActiveConfigWithConstraints.

Aby uniknąć poważnych problemów, takich jak fragmentacja pamięci, na urządzeniach, które nie rezerwują wystarczającej ilości pamięci na stare i nowe bufory ramki, konieczne jest, aby HWC przestał używać starych buforów ramki i zwalniał wszystkie uchwyty do tych buforów, jak pokazano w tych przypadkach:

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

Rekomendacje dotyczące zarządzania buforem ramki

Jeśli HWC nie zwolni w odpowiednim czasie uchwytów do starych buforów ramki, nowa alokacja bufora ramki nastąpi przed dealokacją starego bufora ramki. Może to spowodować poważne problemy, gdy nowa alokacja nie powiedzie się z powodu fragmentacji lub innych problemów. Co gorsza, jeśli HWC w ogóle nie zwalnia tych uchwytów, może dojść do wycieku pamięci.

Aby uniknąć poważnych błędów alokacji, postępuj zgodnie z tymi zaleceniami:

  • Jeśli HWC musi nadal używać starych buforów ramki klienta, dopóki nie zostaną udostępnione nowe bufory ramki klienta, konieczne jest zarezerwowanie wystarczającej ilości pamięci zarówno dla starych, jak i nowych buforów ramki, a także ewentualne uruchomienie algorytmów defragmentacji w przestrzeni pamięci bufora ramki.

  • Przydziel dedykowaną pulę pamięci dla buforów ramki, która jest oddzielona od pozostałej części pamięci bufora graficznego. Jest to ważne, ponieważ między zwolnieniem a ponownym przydzieleniem buforów ramki proces zewnętrzny może próbować przydzielić pamięć graficzną. Jeśli bufor ramki korzysta z tego samego obszaru pamięci graficznej i pamięć graficzna jest pełna, proces zewnętrzny może zająć pamięć graficzną wcześniej przydzieloną przez bufor ramki, co spowoduje, że nie będzie wystarczającej ilości pamięci na ponowne przydzielenie bufora ramki lub może dojść do fragmentacji przestrzeni pamięci.

Testowanie zarządzania buforem ramki

Zalecamy, aby producenci OEM sprawdzali prawidłowe zarządzanie pamięcią bufora ramki klienta w przypadku przełączania rozdzielczości na urządzeniu. Opisujemy to poniżej:

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

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