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:
- Ambil cuplikan menggunakan Unity Memory Profiler.
- Buka snapshot dan buka All of Memory > Resident Memory on Device.
Hitung jumlah item berikut:
- Tidak dilacak
- Android Runtime
- Native
- Terkelola
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.