Sprawdzanie wykorzystania pamięci w Unreal Engine

Wskaźnik 'anonymous RSS + swap' reprezentujący obciążenie pamięci procesu jest kluczowy dla utrzymania stabilności gry. Służy on zarówno jako próg limitu pamięci dla ogranicznika pamięci (Android 17 i nowsze wersje), jak i standardowy test porównawczy dla wskaźników pamięci w konsoli Google Play.

Trudno jest zmierzyć wykorzystanie pamięci, które dokładnie odpowiada wartości „anonymous RSS + swap”, zarówno w czasie działania, jak i statycznie w Unreal Engine.

Do śledzenia wykorzystania pamięci Unreal Engine udostępnia VmRSS + VmSwap wskaźnik. Chociaż jest on szerszy niż „anonymous RSS + swap”, ponieważ VmRSS obejmuje rssFile i rssShmem, nadal stanowi wiarygodne oszacowanie.

Aby przeanalizować wykorzystanie pamięci przez grę:

Wysyłanie zapytań o pamięć za pomocą interfejsów API C++

Aby wysyłać zapytania o wskaźniki pamięci, użyj tych interfejsów API C++:

Lekkie zapytanie o pamięć

Aby wysłać lekkie zapytanie o pamięć, użyj GetMemoryUsedFast. W Androidzie ta metoda zwraca szacowany rozmiar, analizując tylko niezbędne pola pamięci z /proc/self/status, zamiast odczytywać cały plik.

Szczegółowe statystyki pamięci

Aby wysyłać zapytania o szczegółowe statystyki pamięci platformy, użyj GetStats. Ta metoda udostępnia kompleksowe statystyki pamięci platformy, zwracając zarówno FPlatformMemoryStats.UsedPhysical, jak i FPlatformMemoryStats.RssFile. Ponieważ UsedPhysical jest sumą VmRSS i VmSwap, możesz zbliżyć się do wartości testu porównawczego, odejmując od niej RssFile.

#include "HAL/PlatformMemory.h"

uint64 GetEstimatedPhysicalMemory()
{
  FPlatformMemoryStats Stats = FPlatformMemory::GetStats();

#if PLATFORM_ANDROID
    return Stats.UsedPhysical - Stats.RssFile;
#else
    return Stats.UsedPhysical;
#endif
}

Monitorowanie pamięci za pomocą poleceń konsoli

Użyj tej metody, aby monitorować trendy wykorzystania pamięci, gdy gra jest uruchomiona na urządzeniu. Aby otworzyć konsolę, dotknij ekranu 4 palcami, a następnie wpisz te polecenia.

Polecenie Opis
stat unit Wyświetla bieżące zagregowane wykorzystanie pamięci fizycznej w wierszu Mem, aktualizowane co klatkę.
stat unitmax Wyświetla średnie i szczytowe zagregowane wykorzystanie pamięci fizycznej i wirtualnej w wierszu Mem.

Nakładka jednostki statystyk Unreal Engine z wierszem Mem.
Rysunek 1. Nakładka stat unit wyświetlająca wiersz Mem
.

Wizualizowanie pamięci za pomocą Unreal Insights

Unreal Insights umożliwia monitorowanie i wizualizowanie wskaźników pamięci, takich jak statystyki pamięci platformy i niestandardowe liczniki, w czasie za pomocą dokładnych wykresów osi czasu.

  1. Połącz urządzenie z kanałami śledzenia pamięci za pomocą flag, które obejmują default,counters, aby wyświetlić wykres PlatformMemory/UsedPhysical (VmRSS + VmSwap) obok osi czasu klatek.
  2. Opcjonalnie: aby dokładniej śledzić niestandardowe wskaźniki pamięci, zadeklaruj i zaktualizuj niestandardowy licznik śledzenia za pomocą TRACE_DECLARE_MEMORY_COUNTER i TRACE_COUNTER_SET.
#include "ProfilingDebugging/CountersTrace.h"

TRACE_DECLARE_MEMORY_COUNTER(Trace_EstimatedPhysicalMemory, TEXT("Memory/EstimatedPhysicalMemory"));

void UpdateMemoryTraceCounter()
{
    // Note: Ensure GetEstimatedPhysicalMemory() is defined as shown
    // in the Query memory at runtime using C++ APIs section.
    TRACE_COUNTER_SET(Trace_EstimatedPhysicalMemory, GetEstimatedPhysicalMemory());
}

Statystyki Unreal pokazujące Memory/EstimatedPhysicalMemory.
Rysunek 2. Oś czasu Unreal Insights pokazująca niestandardowyMemory/EstimatedPhysicalMemory licznik.

Sprawdzanie dokładnego wykorzystania pamięci za pomocą Perfetto

Aby sprawdzić dokładne wartości „anonymous RSS + swap” systemu operacyjnego Android, a nie oszacowanie, użyj Perfetto. Perfetto rejestruje wskaźniki pamięci na poziomie systemu, aby ocenić dokładny rozmiar gry.

Interfejs Perfetto pokazujący anonimowy RSS, przestrzeń wymiany i ich sumę.
Rysunek 3. Interfejs Perfetto pokazujący zapytanie o anonimowy RSS, swap i ich sumę.