Cara memeriksa penggunaan memori dengan alat Unity

Di sistem Android, nilai batas memori untuk Pembatas Memori (Android 17+) dan nilai tolok ukur untuk vital memori di Konsol Google Play adalah 'RSS anonim + swap'. Nilai ini merepresentasikan tingkat tekanan memori fisik yang sebenarnya ditempati oleh proses dan merupakan metrik penting yang harus dipantau untuk operasi aplikasi yang stabil.

Saat ini, sulit untuk mengukur penggunaan memori yang sama persis dengan 'RSS anonim + swap' baik saat runtime maupun secara statis dalam Unity Engine.

Untuk mengatasi hal ini, halaman ini memperkenalkan cara melacak nilai 'RSS anonim + swap' dengan keandalan tinggi melalui perkiraan menggunakan Unity Profiler, ProfileRecorder API, dan Unity Memory Profiler di lingkungan Unity Engine.

Memeriksa penggunaan memori saat runtime

Di Unity, mengukur penggunaan memori 'RSS anonim + swap' Android yang tepat secara langsung saat runtime tanpa overhead bisa jadi sulit. Namun, Anda dapat memperkirakan nilai ini secara cermat (dengan varians ~10%) menggunakan API Profiler bawaan Unity.

Metode 1: Menggunakan Profiler

Anda dapat memperkirakan total penggunaan memori dengan menjumlahkan nilai yang ditampilkan oleh Profiler API berikut:

using UnityEngine;
using UnityEngine.Profiling;

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

        return totalReserved + monoHeapSize;
    }
}

Metode 2: Menggunakan class ProfilerRecorder

Anda dapat melacak metrik Total Memori yang Dicadangkan dan Memori yang Dicadangkan Gfx menggunakan ProfilerRecorder:

  • Di build Pengembangan: Hitung 'Total Memori yang Dicadangkan' - 'Memori yang Dicadangkan Gfx'.

  • Dalam build Rilis: Gunakan 'Total Reserved Memory' secara langsung.

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;
    }
}

Batasan:

  • Alokasi memori yang melewati Pengelola Memori Unity (misalnya, NativeMalloc(IntPtr size)) tidak dapat dilacak oleh API ini.

  • API ini mungkin tidak didukung, bergantung pada versi Unity Anda.

Menganalisis perincian memori (analisis statis)

Jika penggunaan memori yang tinggi terdeteksi saat runtime, Anda perlu mengidentifikasi tempat memori digunakan. Menganalisis distribusi memori memungkinkan Anda menghilangkan alokasi yang tidak perlu dan mengurangi jejak memori game secara keseluruhan.

Unity Memory Profiler

Untuk melakukan analisis memori yang mendalam dan mengoptimalkan game Anda, gunakan paket Unity Memory Profiler. Untuk menemukan item yang sesuai dengan penggunaan 'RSS anonim + swap' Android OS:

  1. Ambil cuplikan menggunakan Unity Memory Profiler.
  2. Buka snapshot dan buka All of Memory > Resident Memory on Device.
  3. Hitung jumlah item berikut:

    • Tidak dilacak
    • Android Runtime
    • Native
    • Terkelola
    Metrik memori yang dapat dilihat saat disetel ke Memori Residen di Unity Memory Profiler
    Gambar 1. Deskripsi Memori disimpan dalam memori residen

Jumlah total berfungsi sebagai pengganti praktis untuk 'RSS anonim + swap' Android OS, yang memberikan hasil analisis yang bisa ditindaklanjuti untuk analisis memori game.

Batasan:

  • Saat tekanan memori berat, Android OS dapat mengompresi atau menukar halaman memori aktif untuk membebaskan RAM. Karena Unity Memory Profiler tidak dapat melacak memori yang ditukar, perbedaan mungkin muncul selama skenario penggunaan memori yang tinggi.

  • Fitur ini mungkin terbatas, bergantung pada versi Unity Anda.

Penilaian yang lebih akurat

Untuk memverifikasi nilai 'RSS anonim + swap' Android OS yang tepat, gunakan Perfetto. Dengan alat ini, Anda dapat mengukur penggunaan memori tingkat sistem yang akurat dan menganalisis jejak memori game Anda secara menyeluruh.