Unity araçlarıyla bellek kullanımını kontrol etme

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:

  1. Unity Memory Profiler'ı kullanarak anlık görüntü yakalama.
  2. Anlık görüntüyü açın ve Tüm Bellek > Cihazdaki Yerleşik Bellek'e gidin.
  3. Aşağıdaki öğelerin toplamını hesaplayın:

    • İzlenmiyor
    • Android Çalışma Zamanı
    • Yerel
    • Yönetilen
    Unity Memory Profiler'da Resident Memory olarak ayarlandığında görüntülenebilen bellek metrikleri
    Ş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.