Zarządzanie framebufferem klienta

Od Androida 13 system przydziela nowe bufory ramki używane podczas kompozycji klienta za każdym razem, gdy zmienia się rozdzielczość wyświetlacza. SurfaceFlinger przeprowadza tę alokację w następnym cyklu unieważnienia po zmianie rozdzielczości.

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

Zmiany rozdzielczości mogą być spowodowane jedną z tych 2 sytuacji:

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

    Podczas zdarzenia hotplug HWC zwalnia uchwyty do starych buforów ramki, gdy zwalnia stare dane wyświetlania.

  • Przełączanie trybu wyświetlania zainicjowane przez SurfaceFlinger, które następuje, gdy zmieniasz rozdzielczość za pomocą ustawień użytkownika lub gdy aplikacja zmienia rozdzielczość za pomocą preferredDisplayModeId.

    Podczas przełączania trybu wyświetlania SurfaceFlinger zwalnia uchwyty do istniejących buforów ramowych klienta przed wywołaniem funkcji setActiveConfig lub setActiveConfigWithConstraints.

Aby zapobiec poważnym problemom, takim jak fragmentacja pamięci na urządzeniach z niewystarczającą ilością pamięci bufora ramki, HWC musi zwalniać uchwyty do starych buforów ramki. Jest to szczególnie ważne w tych przypadkach:

Zwolnienie uchwytów umożliwia całkowite zwolnienie pamięci bufora ramki przed przydzieleniem przez SurfaceFlinger nowych buforów ramek podczas następnego cyklu invalidate.

Rekomendacje dotyczące zarządzania buforem ramki

Jeśli HWC nie zwolni w odpowiednim czasie uchwytów do starych buforów ramki, nowe bufory ramki zostaną przydzielone przed zwolnieniem starych buforów 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 na stare i nowe bufory ramki oraz 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ż proces innej firmy może próbować przydzielić pamięć graficzną między zwolnieniem a ponownym przydzieleniem bufora ramki. Jeśli bufor ramki korzysta z tej samej puli pamięci graficznej i pamięć graficzna jest pełna, proces zewnętrzny może zająć pamięć wcześniej przydzieloną przez bufor ramki. Może to prowadzić do niewystarczającej ilości pamięci na ponowne przydzielenie bufora ramki lub fragmentacji 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ń podłączania i odłączania na gorąco odłącz i ponownie podłącz 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.