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 onClipMemory()
System wykorzystuje
onTrimMemory()
, aby powiadomić aplikację, że kończy się pamięć i aplikacja może zostać zamknięta. Wiele
jest to jedyne ostrzeżenie, jakie otrzymuje aplikacja. To wywołanie zwrotne ma duże opóźnienie
względem
low-memory killer (LMK),
dlatego tak ważne jest szybkie reagowanie na to wywołanie.
W odpowiedzi na to wywołanie zwrotne zmniejsz szybkość, liczbę i rozmiar przydziałów.
Funkcja onTrimMemory()
przekazuje stałą wartość, która wskazuje poziom ważności, ale
zareagować na pierwsze ostrzeżenie,
by przydzielać środki szybciej niż
onTrimMemory()
może zareagować.
Kotlin
class MainActivity : AppCompatActivity(), ComponentCallbacks2 { override fun onTrimMemory(level: Int) { when (level) { ComponentCallbacks2.TRIM_MEMORY_MODERATE, ComponentCallbacks2.TRIM_MEMORY_RUNNING_LOW, ComponentCallbacks2.TRIM_MEMORY_RUNNING_CRITICAL -> // Respond to low memory condition else -> Unit } } }
Java
public class MainActivity extends AppCompatActivity implements ComponentCallbacks2 { public void onTrimMemory(int level) { switch (level) { case ComponentCallbacks2.TRIM_MEMORY_RUNNING_MODERATE: // Respond to low memory condition break; case ComponentCallbacks2.TRIM_MEMORY_RUNNING_LOW: // Respond to low memory condition break; case ComponentCallbacks2.TRIM_MEMORY_RUNNING_CRITICAL: // Respond to low memory condition break; default: break;
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 pamięci RAM: więcej pamięci zRAM oznacza, że gra może mieć więcej pamięci.
do przydziału. Ta kwota może się różnić w zależności od urządzenia. szukaj
SwapTotal
w/proc/meminfo
, aby znaleźć tę wartość. - 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 logi czasu, dzięki czemu możesz zobaczyć, jak zmienia się kanał 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.
zgłoszenie błędu
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,