Zarządzanie framebufferem klienta

Od Androida 13 nowe framebuffery używane podczas komponowania przez klienta są przydzielane, gdy tylko zmieni się rozdzielczość wyświetlacza. Ta alokacja jest wykonywana przez SurfaceFlinger w następnym cyklu unieważniania po zmianie rozdzielczości.

Zarządzanie ramką obrazu podczas przełączania rozdzielczości

Zmiany rozdzielczości występują w jednym z tych 2 sytuacji:

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

    Podczas zdarzenia hotplug uchwyty starych framebufferów są uwalniane, gdy stare dane wyświetlania zostaną zwolnione.

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

    Podczas przełączania trybu wyświetlania uchwyty do istniejących framebufferów klienta są uwalniane przez SurfaceFlingera przed wywołaniem funkcji setActiveConfig lub setActiveConfigWithConstraints.

Aby uniknąć katastrofalnych problemów, takich jak fragmentacja pamięci, na urządzeniach, które nie zarezerwowały wystarczającej ilości pamięci dla starych i nowych ramek framebuffera, ważne jest, aby HWC przestało używać starych ramek framebuffera i zwolnić wszystkie uchwyty do tych ramek w tych przypadkach:

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

Rekomendacje dotyczące zarządzania framebufferem

Jeśli HWC nie zwolni uchwytów starych framebufferów na czas, przydzielenie nowego framebuffera nastąpi przed zwolnieniem starego. 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ąć poważnych błędów przy przypisywaniu, postępuj zgodnie z tymi zaleceniami:

  • Jeśli HWC musi nadal używać starych buforów ramki klienta do czasu udostępnienia nowych buforów ramki klienta, należy zarezerwować wystarczającą ilość pamięci dla starych i nowych buforów ramki oraz ewentualnie uruchomić algorytmy defragmentacji na przestrzeni pamięci bufora ramki.

  • Przydziela osobny pulę pamięci dla framebufferów, która jest oddzielona od reszty pamięci bufora graficznego. Jest to ważne, ponieważ w czasie oddzielenia i przydzielenia framebufferów proces zewnętrzny może próbować przydzielić pamięć graficzną. Jeśli ten sam pulę pamięci graficznej używa bufora ramki, a pamięć graficzna jest pełna, proces zewnętrzny może zajmować pamięć graficzną przydzieloną wcześniej przez bufor ramki, pozostawiając w ten sposób niewystarczającą ilość pamięci na potrzeby przydzielenia bufora ramki lub powodując fragmentację przestrzeni pamięci.

Testowanie zarządzania framebufferem

Producenci OEM powinni przetestować prawidłowe zarządzanie pamięcią buforową klienta na różnych przełącznikach rozdzielczości na urządzeniu, jak opisano 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 weryfikatora CTS, aby zainicjować przełączenie trybu w celu przetestowania zachowania pamięci framebuffera. Ten test może wizualnie zidentyfikować problemy, które są trudne do wykrycia za pomocą programów.