Bitmapy są często największymi obiektami w aplikacji, które zużywają pamięć. Operacje dekodowania i skalowania często znajdują się na ścieżce krytycznej renderowania klatek. Optymalizacja wykorzystania pamięci bitmapy znacznie poprawia szybkość reakcji interfejsu, żywotność baterii i ogólną stabilność, ponieważ zmniejsza liczbę zacięć, błędów ANR i zakończeń procesów związanych z błędem OOM.
Czynniki wpływające na wysokie wykorzystanie pamięci bitmapy
W obliczeniach może być też uwzględniona pamięć wirtualna, która nigdy nie była używana. Jeśli widzisz nieoczekiwanie wysokie wykorzystanie pamięci bitmapy, sprawdź, czy nie przydzielasz pamięci, która nie jest używana.
Zasoby
Analizowanie bitmap w Android Studio
Profilowanie w Android Studio w przypadku map bitowych
Używaj narzędzia Memory Profiler do sprawdzania alokacji pamięci w czasie rzeczywistym, przechwytywania zrzutów sterty i analizowania obiektów pod kątem wycieków pamięci. Używaj też analizatora sterty do wykrywania wycieków pamięci, identyfikowania zduplikowanych alokacji bitmap i wizualizowania zachowywania obiektów.
Automatyczne wykrywanie wycieków pamięci za pomocą LeakCanary
Zintegruj bibliotekę LeakCanary, aby zautomatyzować wykrywanie wycieków pamięci w aplikacji. Biblioteka LeakCanary zapewnia automatyczną analizę sterty, identyfikując obiekty, które powinny zostać usunięte z pamięci, ale nadal się w niej znajdują, np. mapy bitowe zachowane przez zniszczone komponenty.
Dokumentacja dotycząca wydajności bitmap
Te zasoby zawierają kompleksowe wskazówki dotyczące sprawdzonych metod wydajnego zarządzania mapami bitowymi w różnych komponentach Androida.
Lista kontrolna dla deweloperów dotycząca optymalizacji wykorzystania pamięci przez bitmapy
Aby zoptymalizować wykorzystanie pamięci przez bitmapę, postępuj zgodnie z 3 podstawowymi zasadami: zmniejszaj, ponownie wykorzystuj i odzyskiwuj.
- Zmniejsz: zminimalizuj początkowe wykorzystanie pamięci podczas wczytywania lub wyświetlania bitmap.
- Ponowne użycie: wdróż mechanizmy buforowania, aby uniknąć zbędnego przydzielania pamięci na mapy bitowe.
- Recykling: aktywne zwalnianie zasobów, aby umożliwić ponowne przydzielenie pamięci aktywnym procesom.
Ta lista kontrolna dla deweloperów pomoże Ci zoptymalizować wykorzystanie pamięci bitmapy.
| Podstawowa zasada | Obszar | Opis |
|---|---|---|
| Ogranicz | Usuwanie zduplikowanych bitmap | Analizuj zrzuty sterty za pomocą narzędzia Memory Profiler, aby wykrywać zbędne alokacje bitmap. Zapoznaj się z przewodnikiem Zarządzanie pamięcią bitmap. |
| Korzystanie z bibliotek wczytywania obrazów | Używaj bibliotek takich jak Glide i Coil, aby zautomatyzować wątki, buforowanie i wydajne dekodowanie. | |
| Wdrażanie downsamplingu | Dekoduj obrazy, aby dopasować je do wymiarów docelowego kontenera interfejsu, zamiast wczytywać komponenty w pełnej rozdzielczości. | |
| Używaj formatu RGB_565 w przypadku nieprzezroczystych obrazów | Zmniejsz wykorzystanie pamięci o 50% przez przejście z ARGB_8888 na 16-bitową konfigurację w przypadku obrazów bez przezroczystości. |
|
| Nadawanie priorytetu obiektom VectorDrawable | Używaj wektorów w przypadku ikon i podstawowych elementów graficznych, aby zapewnić wyraźne skalowanie przy minimalnym obciążeniu pamięci. | |
| Optymalizacja dostarczania obrazów po stronie serwera | Skonfiguruj interfejsy API backendu, aby serwować obrazy dostosowane do gęstości urządzenia i wymiarów kontenera interfejsu. | |
| Usuwanie przezroczystych marginesów | Unikaj przydzielania pamięci na „niewidoczne” piksele, używając zamiast wbudowanych marginesów klasy InsetDrawable lub dopełnienia układu. Zobacz Tworzenie aplikacji na Androida o wysokiej wydajności pamięci. | |
| Ponowne użycie | Konfigurowanie optymalnych rozmiarów pamięci podręcznej | Dostosowywanie limitów pamięci i pamięci podręcznej dysku na podstawie pamięci RAM urządzenia i rozdzielczości ekranu. Więcej informacji znajdziesz w artykule Caching Bitmaps (w języku angielskim). |
| Recykling | Trwałe usuwanie zasobów w tle | Wdróż TRIM_MEMORY_BACKGROUND, aby wyczyścić pamięć podręczną i zwiększyć szansę na przetrwanie procesu w przypadku obciążenia pamięci systemowej. |
| Zwalnianie zasobów po ukryciu interfejsu | Używaj TRIM_MEMORY_UI_HIDDEN, aby zwalniać pamięć podręczną map bitowych, gdy aplikacja nie jest już widoczna dla użytkownika. |
|
| Monitorowanie wycieków pamięci | Użyj narzędzi LeakCanary i Memory Profiler, aby znaleźć bitmapy zachowane po zniszczeniu elementu LifecycleOwner. Więcej informacji znajdziesz w artykule Zarządzanie pamięcią aplikacji. |