Począwszy od Androida 13, nowe bufory klatek używane podczas klient są przydzielane, gdy zmienia się rozdzielczość wyświetlania. Ten alokacja jest wykonywana przez SurfaceFlinger w następnym cyklu unieważniania po zmianie rozdzielczości.
Zarządzanie buforem klatek podczas przełączania rozdzielczości
Rozdzielczość występuje z powodu jednej z tych przyczyn 2 sytuacje:
zdarzenia Hotplug, zainicjowane przez narzędzie Hardware Composer (HWC), co ma miejsce przy przełączaniu się na jeden na wyświetlaczu zewnętrznym o innej rozdzielczości domyślnej.
Podczas zdarzenia Hotplug uchwyty starych buforów ramek są zwalniane gdy starsze dane reklam displayowych zostaną objęte licencją.
Przełącznik trybu wyświetlania zainicjowany przez usługę SurfaceFlinger, który występuje, gdy użytkownik zmieni rozdzielczość w ustawieniach użytkownika, lub aplikacja zmieni rozdzielczość za pomocą
preferredDisplayModeId
.Podczas przełączania trybu wyświetlania uchwyty istniejących buforów klatek klienta są udostępniane przez SurfaceFlinger przed wywołaniem
setActiveConfig
lubsetActiveConfigWithConstraints
.
Aby uniknąć katastrofalnych problemów, takich jak fragmentacja pamięci, na urządzeniach, nie zarezerwują dość pamięci dla starych i nowych buforów ramek. że HWC przestaje używać starych buforów ramek i udostępnia uchwyty do buforów ramek, jak w tych przypadkach:
W przypadku zdarzeń typu „hotplug” (podłączenie gorąca) bezpośrednio przed połączeniem telefonicznym
onHotplug
.W przypadku przełączania trybów bezpośrednio po wywołaniu z użytkownikiem
setActiveConfig
lubsetActiveConfigWithConstraints
.
Zwolnienie uchwytów umożliwia pełne zwolnienie pamięci bufora ramki przed alokacją nowych buforów ramek tworzonych przez SurfaceFlinger. podczas następnego cyklu unieważniania.
Zalecenia dotyczące zarządzania buforem ramek
Jeśli HWC nie doda uchwytów do starych buforów klatek na czas, nowy przydział bufora ramek odbywa się przed starym buforem ramek Deallocation. Może to spowodować katastrofalne problemy, gdy nowy przydział się nie powiedzie z powodu fragmentacji lub innych problemów. Co gorsza, HWC w ogóle ich nie udostępnia, ponieważ wyciek pamięci może wystąpienia.
Aby uniknąć katastrofalnych błędów alokacji, postępuj zgodnie z tymi zaleceniami:
Jeśli HWC musi nadal używać starych buforów ramek klienta do czasu, gdy nowy bufory ramek klienta, ważne jest, aby zarezerwować wystarczającą ilość pamięci zarówno dla starych, jak i nowych buforów ramek. Możesz też uruchomić defragmentację, do pamięci bufora ramki.
Przydziel dedykowaną pulę pamięci na bufory klatek niezależnie od reszty pamięci bufora grafiki. To ważne, ponieważ w okresie alokacji i ponownej alokacji buforów ramek, proces zewnętrzny może i spróbuje przydzielić pamięć karty graficznej. Jeśli ta sama pula pamięci karty graficznej używane przez bufor klatek, a jeśli pamięć karty graficznej jest zapełniona, może zająć pamięć graficzną przydzieloną wcześniej przez bufor klatek, zostawiając za mało pamięci, by ponownie przypisać bufor ramki, fragmentacji miejsca w pamięci.
Przetestuj zarządzanie buforem ramek
Zalecamy producentom OEM przetestowanie poprawnego zarządzania pamięcią bufora ramki klienta przełączników rozdzielczości w swoich urządzeniach, opisanych w ten sposób:
W przypadku zdarzeń typu „gorąca wtyczka” wystarczy odłączać i ponownie podłączać dwa różne ekrany mają różne rozdzielczości.
W przypadku przełączników trybów użyj narzędzia CTS
ModeSwitchingTestActivity
Test weryfikatora polegający na zainicjowaniu przełącznika trybu w celu testowania zachowania pamięci bufora ramek. Ten test pomaga wizualnie zidentyfikować problemy, które są trudne do wykrycia automatycznie.