Android platformunda sistem, mümkün olduğunca fazla sistem belleği (RAM) kullanmaya çalışır ve gerektiğinde alan açmak için çeşitli bellek optimizasyonları gerçekleştirir. Bu optimizasyonlar, oyununuzu yavaşlatarak veya tamamen kapatarak olumsuz etkileyebilir. Bu optimizasyonlar hakkında daha fazla bilgiyi İşlemler arasında bellek ayırma başlıklı makalede bulabilirsiniz.
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 verme
Sistem, uygulamanızı, uygulamanızın bellek kullanımını gönüllü olarak azaltması ve diğer uygulamaların kullanması için bellek boşaltmak üzere düşük bellek nedeniyle işlem sonlandırma (LMK) tarafından sonlandırılmaktan kaçınması için iyi bir fırsat sunan yaşam döngüsü etkinlikleri hakkında bilgilendirmek üzere onTrimMemory()
kullanır.
Uygulamanız arka planda kapatılırsa kullanıcı uygulamanızı bir sonraki açışında yavaş bir sıfırdan başlatma deneyimi yaşar. Arka plana geçerken bellek kullanımını azaltan uygulamaların arka planda sonlandırılma olasılığı daha düşüktür.
Kırpma etkinliklerine yanıt verirken, hemen ihtiyaç duyulmayan ve gerektiğinde yeniden oluşturulabilecek büyük bellek ayırmalarını serbest bırakmak en iyisidir. Örneğin, uygulamanızda yerel olarak depolanan sıkıştırılmış resimlerden çözülen bit eşlemlerin önbelleği varsa TRIM_MEMORY_UI_HIDDEN
yanıt olarak bu önbelleği kırpmak veya temizlemek genellikle iyi bir fikirdir.
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()) } }
Bellek bütçeleri konusunda tutumlu olun
Belleğin tükenmesini önlemek için bellek bütçesini tutumlu bir şekilde kullanın. Göz önünde bulundurulması gereken bazı noktalar şunlardır:
- Fiziksel RAM boyutu: Oyunlar genellikle cihazdaki fiziksel RAM miktarının ¼'ü ile ½'si arasında bir bölümünü kullanır.
- Maksimum zRAM boyutu: Daha fazla zRAM, oyunun tahsis edebileceği daha fazla bellek olabileceği anlamına gelir. Bu tutar cihaza göre değişebilir. Bu değeri bulmak için
SwapTotal
simgesini arayın./proc/meminfo
- İşletim sisteminin bellek kullanımı: Sisteme daha fazla RAM ayıran cihazlar, oyununuz için daha az bellek bırakır. Sistem, sistem işlemlerini sonlandırmadan önce oyununuzun işlemini sonlandırır.
- Yüklü uygulamaların bellek kullanımı: Oyununuzu, çok sayıda uygulama yüklü olan cihazlarda test edin. Sosyal medya ve sohbet uygulamalarının sürekli çalışması gerekir ve bu durum boş bellek miktarını etkiler.
Muhafazakar bir bellek bütçesi oluşturamıyorsanız daha esnek bir yaklaşım benimseyin. Sistemde bellek azlığı sorunları yaşanırsa oyunun kullandığı bellek miktarını azaltın. Örneğin, onTrimMemory()
yanıtı olarak daha düşük çözünürlüklü dokular ayırın veya daha az gölgelendirici depolayın. Bellek ayırma konusunda bu dinamik yaklaşım, özellikle oyun tasarımı aşamasında geliştiricinin daha fazla çalışmasını gerektirir.
Aşırı yüklenmeyi önleme
Thrashing, boş bellek azaldığında ancak oyunu sonlandıracak kadar azalmadığında meydana gelir.
Bu durumda, kswapd
, oyunun hâlâ ihtiyaç duyduğu sayfaları geri almış olduğundan sayfaları bellekten yeniden yüklemeye çalışır. Yeterli alan olmadığından sayfalar sürekli olarak değiştiriliyor (sürekli değiştirme).
Sistem izleme, bu durumu kswapd
'nin sürekli olarak çalıştığı bir iş parçacığı olarak bildirir.
Aşırı yüklenmenin bir belirtisi, uzun kare süreleridir (bir saniye veya daha uzun olabilir). 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.
Meminfo
Bu araç, ne kadar PSS belleğinin ayrıldığını ve hangi kategorilerde kullanıldığını göstermek için bellek istatistiklerini toplar.
meminfo istatistiklerini aşağıdaki yöntemlerden birini kullanarak yazdırın:
adb shell dumpsys meminfo package-name
komutunu kullanın.- Android Debug API'deki
MemoryInfo
çağrısını kullanın.
PrivateDirty
istatistiği, işlemdeki diske aktarılamayan ve diğer işlemlerle paylaşılmayan RAM miktarını gösterir. Bu tutarın büyük bir kısmı, işlem sonlandırıldığında sistem tarafından kullanılabilir.
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. Hesaplanması daha hızlı olduğundan RSS, bellek boyutu değişikliklerinde daha ayrıntılı bir ayrıntı düzeyi göstererek en yüksek bellek kullanımının daha doğru ölçülmesini sağlar. Bu nedenle, oyunun belleğinin tükenmesine neden olabilecek zirveleri fark etmek daha kolaydı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. RSS'nin zaman içinde nasıl değiştiğini görebilmeniz için rastgele uzunluktaki izlemeleri destekler. Ayrıca, çevrimdışı işleme için oluşturduğu veriler üzerinde SQL sorguları da yayınlayabilirsiniz. Sistem İzleme uygulamasından uzun izlemeleri etkinleştirin. İzleme için memory:Memory kategorisinin etkinleştirildiğinden emin olun.
heapprofd
heapprofd
, Perfetto'nun bir 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
, Python komut dosyası kullanılarak başlatılabilir. Araç düşük ek yüke sahip olduğundan Malloc Debug gibi diğer araçlar gibi performansı etkilemez.
hata raporu
bugreport
, oyununuzun bellek yetersizliğinden dolayı kilitlenip kilitlenmediğini öğrenmenizi sağlayan bir günlük kaydı aracıdır. Bu aracın çıktısı, logcat kullanmaktan çok daha ayrıntılıdır. Oyununuzun bellek yetersizliğinden kilitlenip kilitlenmediğini veya LMK tarafından sonlandırılıp sonlandırılmadığını gösterdiği için bellek hata ayıklaması açısından faydalıdır.
Daha fazla bilgi için Hata raporlarını yakalama ve okuma başlıklı makaleyi inceleyin.