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.