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 bilgi edinebilirsiniz konuda İşlemler arasında bellek tahsisi.

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

onTrimMemory() için yanıt verme

Sistem, onTrimMemory() uygulamanız için iyi bir fırsat sunan yaşam döngüsü olayları hakkında ve bellek kullanımını gönüllü olarak azaltmaya çalışan bir uygulama olan düşük bellekli katil (LMK) Böylece diğer uygulamaların kullanması için belleği serbest bırakın.

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. Göz önünde bulundurulması gereken bazı noktalar şunlardır:

  • 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, oyunda daha fazla bellek olabileceği anlamına gelir belirler. 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. Hafızaya bu dinamik yaklaşım, tahsis etmek için geliştiricinin daha fazla çalışma yapması gerekir (özellikle oyun tasarımı aşamasındayız.

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). Azalt oyunun bellek ayak izini azaltıyor.

Mevcut araçları kullanma

Android, sistemin nasıl çalıştığını anlamanıza yardımcı olacak belleği yönetir.

Meminfo

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 şu yöntemleri kullanabilirsiniz:

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

PrivateDirty istatistiği, dönüşüm hunisinin işlem içinde diske sayfalandırılamayan ve paylaşılmayan RAM miktarı diğer süreçlerle de uyumlu olması gerekir. 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ı. Hesaplama daha hızlı olduğundan RSS, en yüksek bellek kullanımının daha doğru ölçülmesi için bellek boyutunda değişiklik yapma. Bu nedenle, oyunun bitmesine neden olabilecek zirveleri fark etmek daha kolaydır. yer alır.

Perfetto ve uzun izler

Perfetto, çeşitli kaynaklardan toplanan verileri toplamaya yönelik bir araç paketidir. web tabanlı kullanıcı arayüzünde görüntüleme ve performans ile bellek bilgilerini kapsar. 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, Perfetto'nun bir parçası olan bir bellek izleme aracıdır. Bu araç, malloc kullanılarak hafızanın nereye ayrıldığını göstererek hafıza sızıntılarını bulmanıza yardımcı olabilir. heapprofd, aşağıdakileri kullanarak başlatılabilir: Python komut dosyası kullanır ve aracın ek yükü düşük olduğundan, daha iyi performans gösterir.

hata raporu

bugreport, oyununuzun kilitlenip kilitlenmediğini öğrenebileceğiniz bir günlük kaydı aracıdır çünkü bellek tükendi. Bu aracın sunduğu çıkış, logcat'e dokunun. 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.