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çindeSwapTotal
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.