Oyunlarda hafızayı etkili şekilde yönetin

Android platformunda sistem, mümkün olduğunca çok sistem belleği (RAM) kullanmaya çalışır. mümkün olan en iyi şekilde çalışır ve gerektiğinde yer açmak için çeşitli bellek optimizasyonları yapar. Bu optimizasyonlar oyununuzu yavaşlatabilir. ya da tamamen öldürür. Bu optimizasyonlar hakkında daha fazla bilgiyi İşlemler arasında bellek ayırma konusunda bulabilirsiniz.

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

onTrimMemory() işlevine yanıt verme

Sistem, uygulamanızın hafıza kullanımını gönüllü olarak azaltması ve diğer uygulamaların kullanabileceği hafızayı boşaltmak için düşük hafıza öldürücü (LMK) tarafından kapatılmaması için iyi bir fırsat sunan yaşam döngüsü etkinlikleri hakkında uygulamanızı bilgilendirmek üzere onTrimMemory() kullanır.

Uygulamanız arka planda sonlandırılırsa kullanıcının bir sonraki başlatılışında kullanıcıların uygulamanızı daha fazla baştan başlatma. Vaktini azaltan uygulamalar arka plana geçiş yapıldığında son kullanma olasılığı daha düşüktür arka plan.

Kırpma etkinliklerine yanıt verirken, büyük bellek ayırmaları serbest bırakmak en iyisidir Bunlar hemen ihtiyaç duyulmayan ve talep üzerine yeniden oluşturulabilen reklamlardır. Örneğin, Örneğin, uygulamanızda kodu yerel olarak çözülmüş bit eşlemler içeren bir önbellek varsa depoladığınız resimler varsa, bu dosyaları kırpmak veya kalıcı olarak şuna yanıt olarak önbellek: TRIM_MEMORY_UI_HIDDEN.

Kotlin

class MainActivity : AppCompatActivity(), ComponentCallbacks2 {
    override fun onTrimMemory(level: Int) {
        if (level >= ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN) {
            // Release memory related to UI elements, such as bitmap caches.
        }
        if (level >= ComponentCallbacks2.TRIM_MEMORY_BACKGROUND) {
            // Release memory related to background processing, such as by
            // closing a database connection.
        }
    }
}

Java

public class MainActivity extends AppCompatActivity implements ComponentCallbacks2 {
    public void onTrimMemory(int level) {
        switch (level) {
            if (level >= ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN) {
                // Release memory related to UI elements, such as bitmap caches.
            }
            if (level >= ComponentCallbacks2.TRIM_MEMORY_BACKGROUND) {
                // Release memory related to background processing, such as by
                // closing a database connection.
            }
        }
    }
}

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'yı kullanma

Memory Advice API, daha yüksek geri çağırma ve hassasiyete sahip onTrimMemory alternatifi ÖYK'leri tahmin ediyor. API bunu, kullanıcı sayısını tahmin etmek için bir e-posta alır ve belirli kullanıcılar eşikler aşıldığından emin olun. API, projenizin tahmini yüzdesini de doğrudan uygulamanıza yönlendirebilirsiniz. Memory Advice API'yi kullanarak şuna alternatif: onTrimMemory etkinliklerdir.

Memory Advice API'yi kullanmak için kullanmaya başlayabilirsiniz.

Bellek bütçelerinde muhafazakar olun

Bellek miktarının tükenmesini önlemek için belleği ölçülü biçimde harcayın. Bazı öğeler şunları dahil edebiliriz:

  • Fiziksel RAM boyutu: Oyunlar genellikle fiziksel depolamanın 1⁄4 ve 1⁄2'sini kullanır Cihazdaki RAM miktarı.
  • Maksimum zRAM boyutu: Daha fazla zRAM, oyunun ayırabileceği daha fazla bellek olduğu anlamına gelir. Bu tutar cihaza göre değişebilir. SwapTotal arayın: /proc/meminfo aracını da kullanabilirsiniz.
  • İşletim sisteminin bellek kullanımı: Sisteme daha fazla RAM atayan cihazlar oyununuz için daha az bellek bırakır. Sistem, oyununuzun işlemden ibaret değildir.
  • Yüklü uygulamaların bellek kullanımı: Oyununuzu Yüklü uygulama sayısı. Sosyal medya ve sohbet uygulamalarının sürekli çalışması ve miktarıdır.

İhtiyatlı bir bellek bütçesi kullanamıyorsanız daha esnek bir bahsedeceğiz. Sistem düşük bellek sorunlarıyla karşılaşırsa bellek miktarını azaltın gösterir. Örneğin, daha düşük çözünürlüklü dokular atayın veya onTrimMemory() yanıtına göre daha az gölgelendirici. 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.

Baskıdan kaçının

Boş bellek az olduğunda ancak oyunu bitirecek kadar düşük olmadığında takıntı meydana gelir. Bu durumda kswapd oyunun hâlâ ihtiyaç duyduğu sayfaları geri aldı, bu nedenle sayfaları bellekten yeniden yüklemeye çalışıyor. Yeterli alan olmadığı için sayfalar sürekli olarak değiştirilir (sürekli değişim). Sistem izleme bu durumu bir ileti dizisi olarak bildirir Burada kswapd kesintisiz olarak çalışır.

Rahatsızlık belirtilerinden biri 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 nasıl çalıştığını anlamanıza yardımcı olacak belleği yönetir.

Hafıza Bilgisi

Bu araç, ne kadarının depolandığını göstermek için PSS belleği tahsis edilmiş olmasına ve hangi kategorilerde kullanıldığına ilişkin genel bir bakış sağlar.

meminfo istatistiklerini aşağıdaki yöntemlerden birini kullanarak yazdırın:

  • adb shell dumpsys meminfo package-name komutunu kullanın.
  • MemoryInfo görüşmesini kullanma (Android Debug API'sinden).

PrivateDirty istatistiği, süreçteki diske sayfalanamayan ve başka hiçbir işlemle paylaşılmayan RAM miktarını gösterir. Bu tutarın büyük kısmı, sisteme geri bildirimde bulunur.

Bellek izleme noktaları

Bellek izleme noktaları, RSS belleği ne kadar önemli olduğunu göstereceğim. RSS bellek kullanımını hesaplamak, hesaplamadan çok daha hızlıdır PSS kullanımı. Hesaplaması daha hızlı olduğundan RSS, en yüksek bellek kullanımının daha doğru ölçümleri için bellek boyutundaki değişikliklerde daha ayrıntılı bir ayrıntı düzeyi gösterir. Bu nedenle, oyunun bitmesine neden olabilecek zirveleri fark etmek daha kolaydır. yer alır.

Perfetto ve uzun izler

Perfetto, bir cihazdaki performans ve bellek bilgilerini toplayıp web tabanlı bir kullanıcı arayüzünde görüntülemek için kullanılan bir araç paketidir. Rastgele uzun izleri desteklediğinden RSS'nin zaman içinde nasıl değiştiğini görebilirsiniz. Çevrimdışı işleme için ürettiği veriler üzerinde SQL sorguları da yayınlayabilirsiniz. Şuradan uzun izleri etkinleştir: Sistem İzleme uygulaması. Şunlardan emin olun: İzleme için bellek:Bellek kategorisi etkinleştirilmiştir.

Heapprofd

heapprofd, bellek izleme aracıdır Perfetto'nun bir parçası. Bu araç, bellek sızıntılarını tespit etmek için Bu yöntemde bellek malloc kullanılarak ayrılır. heapprofd, bir Python komut dosyası kullanılarak başlatılabilir. Aracın ek maliyeti düşük olduğundan Malloc Debug gibi diğer araçlar gibi performansı etkilemez.

bugreport

bugreport, oyununuzun kilitlenip kilitlenmediğini öğrenebileceğiniz bir günlük kaydı aracıdır çünkü bellek tükendi. Bu aracın çıkışı, logcat'ten çok daha ayrıntılıdır. Oyununuzun kilitlenip kilitlenmediğini gösterdiği için bellekte hata ayıklama için yararlıdır çünkü belleğin dolması ya da ÖYK tarafından öldürülmüş olması gerekir.

Daha fazla bilgi için bkz. Hata raporlarını alın ve okuyun.