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 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/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,