Android sisteminde MemoryLimiter (Android 17+) için bellek sınırı eşiği ve Google Play Console'daki bellek vital'ı için karşılaştırma değeri "anonim RSS + takas"tır. Bu değer, işlem tarafından gerçekten kullanılan fiziksel bellek baskısı düzeyini gösterir ve kararlı uygulama çalışması için izlenmesi gereken kritik bir metriktir.
Şu anda, bellek kullanımını çalışma zamanında veya Unity Engine'de statik olarak "anonim RSS + takas" ile tam olarak eşleşecek şekilde ölçmek zordur.
Bu sorunu çözmek için bu sayfada, Unity Engine ortamında Unity Profiler, ProfileRecorder API ve Unity Memory Profiler kullanılarak yaklaşımla "anonim RSS + takas" değerinin yüksek güvenilirlikle nasıl izleneceği açıklanmaktadır.
Çalışma zamanında bellek kullanımını kontrol etme
Unity'de, ek yük olmadan çalışma zamanında Android'in tam "anonim RSS + takas" bellek kullanımını doğrudan ölçmek zor olabilir. Ancak Unity'nin yerleşik Profiler API'lerini kullanarak bu değeri yakından tahmin edebilirsiniz (~% 10 varyans içinde).
1. yöntem: Profiler'ı kullanma
Toplam bellek kullanımını, aşağıdaki Profil Oluşturucu API'leri tarafından döndürülen değerleri toplayarak tahmin edebilirsiniz:
using UnityEngine;
using UnityEngine.Profiling;
public class MemoryMonitor : MonoBehaviour
{
public long GetEstimatedMemoryUsageBytes()
{
long totalReserved = Profiler.GetTotalReservedMemoryLong();
long monoHeapSize = Profiler.GetMonoHeapSizeLong();
return totalReserved + monoHeapSize;
}
}
2. yöntem: ProfilerRecorder sınıfını kullanma
ProfilerRecorder'ı kullanarak Toplam Ayrılmış Bellek ve Gfx Ayrılmış Bellek metriklerini izleyebilirsiniz:
Geliştirme sürümlerinde: "Toplam Ayrılmış Bellek" - "Gfx Ayrılmış Bellek" değerini hesaplayın.
Yayın derlemelerinde: Doğrudan "Ayrılan Toplam Bellek"i kullanın.
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;
}
}
Sınırlama:
Unity'nin bellek yöneticisini atlayan bellek ayırmaları (ör. NativeMalloc(IntPtr size)) bu API'ler tarafından izlenemez.
Bu API'ler, Unity sürümünüze bağlı olarak desteklenmeyebilir.
Bellek dökümünü analiz etme (statik analiz)
Çalışma zamanında yüksek bellek kullanımı tespit edilirse belleğin nerede kullanıldığını belirlemeniz gerekir. Bellek dağılımını analiz ederek gereksiz ayırmaları ortadan kaldırabilir ve oyunun genel bellekte kapladığı yeri azaltabilirsiniz.
Unity Memory Profiler
Ayrıntılı bir bellek analizi yapmak ve oyununuzu optimize etmek için Unity Memory Profiler paketini kullanın. Android OS'in anonim RSS + takas kullanımına karşılık gelen öğeleri bulmak için:
- Unity Memory Profiler'ı kullanarak anlık görüntü yakalama.
- Anlık görüntüyü açın ve Tüm Bellek > Cihazdaki Yerleşik Bellek'e gidin.
Aşağıdaki öğelerin toplamını hesaplayın:
- İzlenmiyor
- Android Çalışma Zamanı
- Yerel
- Yönetilen
Şekil 1. Bellek Açıklamaları, yerleşik bellekte saklanır.
Toplam, Android OS 'anonim RSS + takas' alanı için pratik bir alternatif olarak işlev görür ve oyun bellek analizi için uygulanabilir analizler sunar.
Sınırlama:
Bellek kullanımı çok yoğun olduğunda Android OS, RAM'i boşaltmak için etkin bellek sayfalarını sıkıştırabilir veya takas edebilir. Unity Memory Profiler, takas edilen belleği izleyemediğinden yüksek bellek kullanımı senaryolarında tutarsızlıklar ortaya çıkabilir.
Bu özellikler, Unity sürümünüze bağlı olarak sınırlı olabilir.
Daha doğru değerlendirme
Tam Android OS "anonymous RSS + swap" değerlerini doğrulamak için Perfetto'yu kullanın. Bu araç, sistem düzeyinde kesin bellek kullanımını ölçmenize ve oyununuzun bellekte kapladığı yeri ayrıntılı bir şekilde analiz etmenize olanak tanır.