Oyunlarda hafızayı etkili şekilde yönetin

Android platformunda sistem, mümkün olduğunca fazla sistem belleği (RAM) kullanmaya çalışır ve gerektiğinde yer açmak için çeşitli bellek optimizasyonları gerçekleştirir. Bu optimizasyonlar oyununuzu yavaşlatarak veya tamamen yok ederek oyununuzu olumsuz yönde etkileyebilir. İşlemler arasında bellek ayırma konusunda bu optimizasyonlar hakkında daha fazla bilgi edinebilirsiniz.

Bu sayfada, oyununuzu etkileyen düşük bellek koşullarından kaçınmak için uygulayabileceğiniz adımlar açıklanmaktadır.

onTrimMemory() işlevine yanıt verin

Sistem, uygulamanıza belleğin azaldığını ve uygulamanın kapatılabileceğini bildirmek için onTrimMemory() özelliğini kullanır. Çoğu zaman bu, uygulamanızın aldığı tek uyarıdır. Bu geri çağırma, düşük bellekli sonla (LMK) ile kıyaslandığında yüksek gecikme süresine sahiptir. Bu nedenle, geri çağırmaya hızlı yanıt vermek çok önemlidir.

Bu geri çağırmaya karşılık olarak ayırmaların hızını, sayısını ve boyutunu azaltın. onTrimMemory(), önem derecesini gösteren bir sabit değer aktarır ancak onTrimMemory() tarafından tepki verilebilecek öğeden daha hızlı şekilde tahsis edebileceğiniz için ilk uyarıya yanıt vermelisiniz.

Kotlin

class MainActivity : AppCompatActivity(), ComponentCallbacks2 {
    override fun onTrimMemory(level: Int) {
        when (level) {
            ComponentCallbacks2.TRIM_MEMORY_MODERATE,
                ComponentCallbacks2.TRIM_MEMORY_RUNNING_LOW,
                ComponentCallbacks2.TRIM_MEMORY_RUNNING_CRITICAL -> // Respond to low memory condition
            else -> Unit
        }
    }
}

Java

public class MainActivity extends AppCompatActivity implements ComponentCallbacks2 {
    public void onTrimMemory(int level) {
        switch (level) {
            case ComponentCallbacks2.TRIM_MEMORY_RUNNING_MODERATE:
              // Respond to low memory condition
                break;
            case ComponentCallbacks2.TRIM_MEMORY_RUNNING_LOW:
              // Respond to low memory condition
                break;
            case ComponentCallbacks2.TRIM_MEMORY_RUNNING_CRITICAL:
              // Respond to low memory condition
                break;
            default:
                break;

C#

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

class LowMemoryTrigger : MonoBehaviour
{
    private void Start()
    {
        Application.lowMemory += OnLowMemory;
    }
    private void OnLowMemory()
    {
        // Respond to low memory condition (e.g., Resources.UnloadUnusedAssets())
    }
}

Memory Advice API beta sürümünü kullanma

Memory Advice API, yaklaşan LMK'ları tahmin etmede çok daha yüksek geri çağırma ve hassasiyete sahip onTrimMemory'e alternatif olarak geliştirilmiştir. API bunu, kullanımdaki bellek kaynakları miktarını tahmin ederek ve ardından belirli eşikler aşıldığında uygulamayı bilgilendirerek yapar. API, tahmini bellek kullanımı yüzdesini de doğrudan uygulamanıza bildirebilir. Memory Advice API'yi, bellek yönetimi amacıyla onTrimMemory etkinliklerine alternatif olarak kullanabilirsiniz.

Memory Advice API'yi kullanmak için başlangıç kılavuzunu kullanın.

Bellek bütçelerinde ihtiyatlı olun

Bellekte yer kalmaması için belleği ölçülü bir şekilde ayarlayın. Göz önünde bulundurulması gereken bazı unsurlar şunlardır:

  • Fiziksel RAM boyutu: Oyunlar genellikle cihazdaki fiziksel RAM miktarının 1/4 ila 1/2'sini kullanır.
  • Maksimum zRAM boyutu: Daha fazla zRAM, oyunun potansiyel olarak daha fazla bellek ayırabileceği anlamına gelir. Bu tutar cihaza göre değişebilir. Bu değeri bulmak için /proc/meminfo içinde SwapTotal uygulamasına bakın.
  • İşletim sisteminin bellek kullanımı: Sistem işlemlerine daha fazla RAM atayan cihazlar oyununuz için daha az bellek bırakır. Sistem, sistem süreçlerini sonlandırmadan önce oyununuzun sürecini sonlandırır.
  • Yüklü uygulamaların bellek kullanımı: Oyununuzu, çok sayıda uygulamanın yüklü olduğu cihazlarda test edin. Sosyal medya ve sohbet uygulamalarının sürekli çalışması ve boş bellek miktarını etkilemesi gerekir.

Konservatif bir bellek bütçesi kullanamıyorsanız daha esnek bir yaklaşım benimseyin. Sistemde düşük bellek sorunları varsa oyunun kullandığı bellek miktarını azaltın. Örneğin, onTrimMemory() değerine karşılık daha düşük çözünürlüklü dokular ayırın veya daha az gölgelendirici saklayın. Bellek ayırmaya yönelik bu dinamik yaklaşım, özellikle oyun tasarım aşamasında, geliştiricinin daha fazla çalışma yapmasını gerektirir.

Çok fazla harcamamaktan kaçının

Tahrip işlemi, boş bellek düşük olduğunda ancak oyunu bitirmeye yetecek kadar düşük olmadığında gerçekleşir. Bu durumda kswapd, oyunda hâlâ ihtiyaç duyulan sayfaları geri aldığı için sayfaları bellekten yeniden yüklemeye çalışır. Yeterli alan yoktur, bu nedenle sayfalar sürekli olarak değiştirilir (sürekli değiştirme). Sistem izleme, bu durumu kswapd öğesinin sürekli çalıştığı bir iş parçacığı olarak bildirir.

Engellemenin bir belirtisi, uzun kare süreleridir (muhtemelen bir saniye veya daha fazla). Bu durumu çözmek için oyunun bellek ayak izini azaltın.

Mevcut araçları kullanma

Android, sistemin belleği nasıl yönettiğini anlamanıza yardımcı olacak bir dizi araç sunar.

Bellek Bilgileri

Bu araç, ne kadar PSS belleğin ayrıldığını ve bunun için kullanıldığı kategorileri göstermek için bellek istatistiklerini toplar.

Meminfo istatistiklerini aşağıdaki yöntemlerden birini kullanarak yazdırabilirsiniz:

  • adb shell dumpsys meminfo package-name komutunu kullanın.
  • Android Debug API'den gelen MemoryInfo çağrısını kullanın.

PrivateDirty istatistiği, işlem içindeki diske çağrı gönderilemeyen ve başka herhangi bir işlemle paylaşılmayan RAM miktarını gösterir. Bu işlem sonlandırıldığında bu tutarın tamamı sisteme ulaşılır.

Bellek izleme noktaları

Bellek izleme noktaları, oyununuzun kullandığı RSS belleği miktarını izler. RSS bellek kullanımını hesaplamak, PSS kullanımını hesaplamaktan çok daha hızlıdır. Hesaplama daha hızlı olduğundan RSS, en yüksek bellek kullanımının daha doğru ölçümü için bellek boyutundaki değişikliklerde daha ayrıntılı bilgi gösterir. Bu nedenle, oyunun bellek tükenmesine neden olabilecek zirve noktalarını fark etmek daha kolaydır.

Perfetto ve uzun izler

Perfetto, cihazlarda performans ve bellek bilgilerini toplayıp web tabanlı kullanıcı arayüzünde görüntülemeye yönelik bir araç paketidir. Rastgele uzun izlemeleri destekler, böylece RSS'nin zaman içinde nasıl değiştiğini görebilirsiniz. Ayrıca, çevrimdışı işleme için ürettiği verilerde SQL sorguları da yayınlayabilirsiniz. Sistem İzleme uygulamasından uzun izleri etkinleştirin. İz için bellek:Bellek kategorisinin etkinleştirildiğinden emin olun.

Heapprofd

heapprofd, Perfetto'nun parçası olan bir bellek izleme aracıdır. Bu araç, malloc kullanılarak belleğin nerede ayrıldığını göstererek bellek sızıntılarını bulmanıza yardımcı olabilir. heapprofd, bir Python komut dosyası kullanılarak başlatılabilir ve aracın ek yükü düşük olduğundan, Malloc Debug gibi diğer araçlar gibi performansı etkilemez.

hata raporu

bugreport, oyununuzun bellek sorunu nedeniyle kilitlenip kilitlenmediğini öğrenmek için kullanabileceğiniz bir günlük kaydı aracıdır. Bu aracın çıktısı, logcat'i kullanmaktan çok daha ayrıntılıdır. Oyununuzun bellek kalmadığı veya LMK tarafından sonlandırıldığı için çöküp düşmediğini gösterdiği için bellekte hata ayıklama için kullanışlıdır.

Daha fazla bilgi için Hata raporlarını yakalama ve okuma konusuna bakın.