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.