Jak sprawdzić wykorzystanie pamięci za pomocą narzędzi Unity

W systemie Android próg limitu pamięci dla Memory Limiter (Android 17+) i wartość odniesienia dla danych o pamięci w Konsoli Google Play to 'anonimowy RSS + przestrzeń wymiany'. Ta wartość reprezentuje poziom obciążenia pamięci fizycznej faktycznie zajmowanej przez proces i jest kluczowym wskaźnikiem, który należy monitorować, aby zapewnić stabilne działanie aplikacji.

Obecnie trudno jest zmierzyć wykorzystanie pamięci, które dokładnie odpowiada „anonimowemu RSS + przestrzeni wymiany”, zarówno w czasie działania, jak i statycznie w silniku Unity.

Aby rozwiązać ten problem, na tej stronie opisujemy, jak śledzić wartość „anonimowy RSS + przestrzeń wymiany” z dużą dokładnością za pomocą przybliżenia przy użyciu narzędzia Unity Profiler, interfejsu API ProfileRecorder i narzędzia Unity Memory Profiler w środowisku silnika Unity.

Sprawdzanie wykorzystania pamięci w czasie działania

W Unity bezpośrednie mierzenie dokładnego wykorzystania pamięci „anonimowy RSS + przestrzeń wymiany” w systemie Android w czasie działania bez obciążenia może być trudne. Możesz jednak dokładnie oszacować tę wartość (z odchyleniem ok. 10%) za pomocą wbudowanych interfejsów API narzędzia Unity Profiler.

Metoda 1: użycie Profilera

Możesz oszacować całkowite wykorzystanie pamięci, sumując wartości zwracane przez te interfejsy API narzędzia Profiler:

using UnityEngine;
using UnityEngine.Profiling;

public class MemoryMonitor : MonoBehaviour
{
    public long GetEstimatedMemoryUsageBytes()
    {
        long totalReserved = Profiler.GetTotalReservedMemoryLong();
        long monoHeapSize = Profiler.GetMonoHeapSizeLong();

        return totalReserved + monoHeapSize;
    }
}

Metoda 2: użycie klasy ProfilerRecorder

Za pomocą narzędzia ProfilerRecorder możesz śledzić dane Total Reserved Memory i Gfx Reserved Memory:

  • W kompilacjach deweloperskich: oblicz wartość „Total Reserved Memory” - „Gfx Reserved Memory”.

  • W kompilacjach produkcyjnych: użyj bezpośrednio wartości „Total Reserved Memory”.

using Unity.Profiling;
using UnityEngine;

public class MemoryMonitor : MonoBehaviour
{
    ProfilerRecorder totalRecorder;

#if DEVELOPMENT_BUILD
    ProfilerRecorder gfxRecorder;
#endif

    private void OnEnable()
    {
        totalRecorder = ProfilerRecorder.StartNew(ProfilerCategory.Memory, "Total Reserved Memory");

#if DEVELOPMENT_BUILD
        gfxRecorder = ProfilerRecorder.StartNew(ProfilerCategory.Memory, "Gfx Reserved Memory");
#endif
    }

    private void OnDisable()
    {
        totalRecorder.Dispose();

#if DEVELOPMENT_BUILD
        gfxRecorder.Dispose();
#endif
    }

    public long GetEstimatedMemoryUsageBytes()
    {
#if DEVELOPMENT_BUILD
        if (totalRecorder.Valid && gfxRecorder.Valid)
        {
            return totalRecorder.LastValue - gfxRecorder.LastValue;
        }
#else
        if (totalRecorder.Valid)
        {
            return totalRecorder.LastValue;
        }
#endif
        return 0;
    }
}

Ograniczenie:

  • Te interfejsy API nie mogą śledzić alokacji pamięci, które omijają menedżera pamięci Unity (np. NativeMalloc(IntPtr size)).

  • Te interfejsy API mogą nie być obsługiwane w zależności od wersji Unity.

Analizowanie podziału pamięci (analiza statyczna)

Jeśli w czasie działania wykryjesz wysokie wykorzystanie pamięci, musisz określić, gdzie jest ona zużywana. Analiza dystrybucji pamięci pozwala wyeliminować niepotrzebne alokacje i zmniejszyć ogólne wykorzystanie pamięci gry.

Unity Memory Profiler

Aby przeprowadzić szczegółową analizę pamięci i zoptymalizować grę, użyj pakietu Unity Memory Profiler. Aby znaleźć elementy odpowiadające wykorzystaniu „anonimowy RSS + przestrzeń wymiany” w systemie operacyjnym Android:

  1. Zrób migawkę za pomocą narzędzia Unity Memory Profiler.
  2. Otwórz migawkę i przejdź do sekcji All of Memory > Resident Memory on Device (Cała pamięć > Pamięć rezydentna na urządzeniu).
  3. Oblicz sumę tych elementów:

    • Untracked
    • środowisko wykonawcze Androida
    • Natywna
    • Zarządzane
    Wskaźniki pamięci widoczne po ustawieniu opcji Pamięć rezydentna w profilerze pamięci Unity
    Rysunek 1. Opisy pamięci są przechowywane w pamięci rezydentnej.

Suma całkowita służy jako praktyczny zamiennik „anonimowy RSS + przestrzeń wymiany” w systemie operacyjnym Android i dostarcza przydatnych statystyk do analizy pamięci gry.

Ograniczenie:

  • Przy dużym obciążeniu pamięci system operacyjny Android może kompresować lub wymieniać aktywne strony pamięci, aby zwolnić pamięć RAM. Ponieważ narzędzie Unity Memory Profiler nie może śledzić wymienianej pamięci, w sytuacjach dużego wykorzystania pamięci mogą wystąpić rozbieżności.

  • Te funkcje mogą być ograniczone w zależności od wersji Unity.

Dokładniejsza ocena

Aby sprawdzić dokładne wartości „anonimowy RSS + przestrzeń wymiany” w systemie operacyjnym Android, użyj narzędzia Perfetto. Umożliwia ono dokładne pomiary wykorzystania pamięci na poziomie systemu i dokładną analizę rozmiaru pamięci gry.