Na platformie Android system próbuje wykorzystać tyle pamięci RAM, ile i wprowadza różne optymalizacje pamięci, aby w razie potrzeby zwolnić miejsce. Te optymalizacje mogą mieć negatywny wpływ na grę, ponieważ spowalniają zepsuć lub całkowicie zabić. Więcej informacji o tych optymalizacji znajdziesz na ten temat Przydział pamięci między procesy.
Na tej stronie dowiesz się, co możesz zrobić, aby uniknąć wyczerpania pamięci. co wpływa na Twoją grę.
Odpowiedź na onTrimMemory()
System wykorzystuje
onTrimMemory()
powiadamiać aplikację o zdarzeniach cyklu życia, które mogą stanowić
do dobrowolnego ograniczenia wykorzystania pamięci przez
narzędzia Low-memory Killer (LMK).
aby zwolnić pamięć dla innych aplikacji.
Jeśli aplikacja zostanie zamknięta w tle, to przy następnym uruchomieniu aplikacji Twoja aplikacja będzie działać wolniej. zimnego startu. Aplikacje, które zmniejszają użycie pamięci podczas przechodzenia do trybu w tle, są mniej narażone na zabicie w tle.
W odpowiedzi na zdarzenia przycinania najlepiej jest zwolnić duże przydziały pamięci
które nie są niezbędne od razu i mogą być rekonstruowane na żądanie. Dla:
na przykład jeśli aplikacja ma pamięć podręczną map bitowych dekodowanych lokalnie
zapisanych skompresowanych obrazów, często warto je przyciąć lub usunąć.
pamięć podręczna w odpowiedzi na
TRIM_MEMORY_UI_HIDDEN
Kotlin
class MainActivity : AppCompatActivity(), ComponentCallbacks2 { override fun onTrimMemory(level: Int) { if (level >= ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN) { // Release memory related to UI elements, such as bitmap caches. } if (level >= ComponentCallbacks2.TRIM_MEMORY_BACKGROUND) { // Release memory related to background processing, such as by // closing a database connection. } } }
Java
public class MainActivity extends AppCompatActivity implements ComponentCallbacks2 { public void onTrimMemory(int level) { switch (level) { if (level >= ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN) { // Release memory related to UI elements, such as bitmap caches. } if (level >= ComponentCallbacks2.TRIM_MEMORY_BACKGROUND) { // Release memory related to background processing, such as by // closing a database connection. } } } }
C#
using UnityEngine; using System.Collections; using System.Collections.Generic; class LowMemoryTrigger : MonoBehaviour { private void Start() { Application.lowMemory += OnLowMemory; } private void OnLowMemory() { // Respond to low memory condition (e.g., Resources.UnloadUnusedAssets()) } }
Korzystanie z interfejsu Memory Advice API w wersji beta
Interfejs Memory Advice API został stworzony jako
to alternatywa dla onClipMemory, która ma znacznie większą czułość i precyzję
i prognozowanie w przypadku systemów zarządzania uczeniem. Aby to osiągnąć, interfejs API szacuje ilość
używanych zasobów pamięci, a następnie powiadamia aplikację, gdy:
przekraczanie progów. Interfejs API może również podawać szacunkowy odsetek
pamięci masowej bezpośrednio do aplikacji. Interfejsu Memory Advice API możesz używać jako
alternatywa dla
onTrimMemory
zdarzeniami do zarządzania pamięcią.
Aby skorzystać z interfejsu Memory Advice API, użyj polecenia dla początkujących.
Zachowaj konserwatywność w budżetach na pamięć
Ustaw budżet pamięci na poziomie zachowawczy, aby uniknąć jej wyczerpania. Niektóre elementy do które warto uwzględnić:
- Rozmiar fizycznej pamięci RAM: gry zużywają zwykle 1⁄4–1⁄2 rozmiaru pamięci fizycznej Ilość pamięci RAM urządzenia.
- Maksymalny rozmiar zRAM: im więcej zRAM, tym więcej pamięci może przydzielić gra. Ta kwota może się różnić w zależności od urządzenia. Aby znaleźć tę wartość, poszukaj
SwapTotal
w/proc/meminfo
. - Wykorzystanie pamięci przez system operacyjny: urządzenia, które przydzielają systemowi więcej pamięci RAM. zostaje mniej pamięci dla gry. System zabija działanie gry przed wyłączeniem procesów systemowych.
- Wykorzystanie pamięci przez zainstalowane aplikacje: przetestuj grę na urządzeniach, które mają wiele zainstalowane aplikacje. Media społecznościowe i komunikatory muszą działać nieprzerwanie ilość wolnej pamięci.
Jeśli nie możesz przeznaczyć budżetu na oszczędzanie pamięci, zastosuj bardziej elastyczne
jak ważna jest pokora. Jeśli w systemie występują problemy z małą ilością pamięci, zmniejsz jej ilość.
używane przez grę. Możesz na przykład przydzielić tekstury o niższej rozdzielczości lub przechowywać
mniej programów do cieniowania w odpowiedzi na polecenie onTrimMemory()
. To dynamiczne podejście do pamięci
alokacja wymaga więcej pracy ze strony dewelopera, zwłaszcza przy projektowaniu gier.
te etapy.
Unikaj thrapania
Wstrząsy mają miejsce, gdy jest mało wolnej pamięci, ale nie na tyle, by eliminować rozgrywkę.
W tej sytuacji gra kswapd
odzyskała strony, które są nadal potrzebne, więc
próbuje ponownie załadować strony z pamięci. Za mało miejsca, dlatego strony
pełna wymiana (ciągła zamiana).
Śledzenie systemu zgłasza tę sytuację jako wątek.
gdzie kswapd
działa nieustannie.
Jednym z objawów szarpania ekranu są długie czasy renderowania klatek, które mogą trwać co najmniej sekundę. Ograniczamy jak wykorzystywać pamięć gry do rozwiązania tej sytuacji.
Korzystanie z dostępnych narzędzi
Android oferuje zestaw narzędzi, które pomagają zrozumieć działanie systemu zarządza pamięcią.
Informacje
To narzędzie zbiera statystyki pamięci, aby pokazać, Pamięć PSS i kategorii, w których został przydzielony.
Wydrukuj statystyki meminfo w jednym ze w następujący sposób:
- Użyj polecenia
adb shell dumpsys meminfo package-name
. - Korzystanie z wywołania
MemoryInfo
za pomocą interfejsu Android Debug API.
Statystyka PrivateDirty
pokazuje
ilość pamięci RAM w procesie, której nie można uporządkować na dysk i nie jest współdzielona
z innymi procesami. Większość tej kwoty staje się dostępna dla
po zatrzymaniu się procesu.
Punkty śledzenia pamięci
Punkty śledzenia pamięci śledzą ilość Pamięć RSS używanych przez grę. Obliczanie wykorzystania pamięci RSS jest znacznie szybsze niż obliczanie wykorzystanie PSS. Szybsze obliczenia są szybsze, więc RSS pokazuje większą szczegółowość zmiany rozmiaru pamięci w celu dokładniejszego pomiaru szczytowego wykorzystania pamięci. Dlatego łatwiej jest zauważyć skoki, które mogą spowodować wyczerpanie się gry. pamięci.
Perfetto i długie ślady
Perfetto to pakiet narzędzi do zbierania danych. wydajność i pamięć urządzenia oraz wyświetlane w interfejsie internetowym. Obsługuje dowolnie długie ścieżki, dzięki czemu możesz sprawdzać, jak zmienia się RSS w czasie. Możesz też wysyłać zapytania SQL do danych, które tworzy do przetwarzania w trybie offline. Włącz długie ślady z Aplikacja do śledzenia systemu. Upewnij się, że parametr W śledzeniu włączona jest kategoria memory:Memory.
Heapprofd
heapprofd
to narzędzie do śledzenia pamięci
wchodząca w skład Perfetto. To narzędzie pomaga znaleźć wycieki pamięci, pokazując
w których pamięć została przydzielona za pomocą funkcji malloc
. heapprofd
można rozpocząć za pomocą
Pythona, a ponieważ to narzędzie ma niewielkie wymagania, nie wpływa
jak w innych narzędziach, takich jak Malloc Debug.
bugreport
bugreport
to narzędzie do rejestrowania dzienników, które pozwala sprawdzić, czy gra uległa awarii
bo zabrakło pamięci. Dane wyjściowe narzędzia są znacznie bardziej szczegółowe niż
Logcat. Jest to przydatne w debugowaniu pamięci, ponieważ pokazuje, czy gra uległa awarii.
bo zabrakło pamięci lub została zatrzymana przez LMK.
Więcej informacji: rejestrowanie i odczytywanie raportów o błędach,