Efektywne zarządzanie pamięcią w grach

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,