2012-08-14 13 views
5

Android için oldukça yeni ve bir oyun geliştirmekteyim. Her şimdi ve yine, memory exceptions bildiren kullanıcılara sahibim. Bu, şaşırtıcı bulduğum bitmapler boyutu en çok 200 kb'dir. Yeni bir sprite oluşturduğumda, BitmapFactory.decodeResource()'u arıyorum. Benim uygulama bir zombi savunma oyunu olduğundan, ben oldukça sık sprite oluşturmayı bekleyebilirsiniz.Android: Bellek Dışı Özel Durum/DecodeResource, VM Bütçesine nasıl eklenir?

Her sprite oluşturduğumda, bir bitmap oluşturmak için kod çözme kaynağını çağırırım. Sorum şu ki, her aktivitenin başlangıcında sadece kod çözme kaynağını çağırmak ve paket seviyesinde bitmap'e başvurmak gerekirse, bu, VM Bütçesinde yer alan bellek miktarını azaltır mı? Eğer png gibi bir görüntü kaynaktan Bitmap kodunu çözerken

cevap

18
  • , bu ziyade KB'leri boyutu görüntünün boyutları hakkında daha bağlıdır.
  • Çıktınızı gerçekten etkilemeden orijinal görüntünün boyutlarını azaltabilirsiniz.
  • Bitmap'leri yeniden kullanmayı deneyin, daha sonra kodlarını çözmeyi deneyin.
  • BitmapFactory.Options() nesnesindeki diğer seçenekleri keşfedin, örneğin, inSampleSize öğesini büyütmek, görüntü için gereken bellek miktarını azaltabilir. örn
     
    BitmapFactory.Options o=new BitmapFactory.Options(); 
    o.inSampleSize = 4; 
    o.inDither=false;      //Disable Dithering mode 
    o.inPurgeable=true;     //Tell to gc that whether it needs free memory, the Bitmap can be cleared 
    myBitMap=BitmapFactory.decodeResource(getResources(),ID, o); 
    
  • yararlı bir zor çözümü ne It azaltacaktır 16'ya inSampleSize ayarı yani maksimum kaliteyi .. azaltabilir sonra OutOfMemoryException yakalamak ve olabilir, yani için başka optimizasyonlar gerçekten çalışıyorsanız resimlerinizin kalitesi ancak en azından uygulamanızı kilitlenmeden kaydedecek, bu uygulamayı bir bitmapte büyük MP görüntüsü yüklemem gereken yerlerden birinde yaptım.
+1

'inPurgeable': Not:' decodeResource (Kaynaklar, int, android.graphics.BitmapFactory.Options) 'veya' decodeFile (String, android.graphics.BitmapFactory ile kullanıldığında Bu bayrak yok sayılır. Seçenekler) '. –

0

Kaynak güvenliğinden görüntü almak için snippet'im. Kendi sampleSize'unuzu görüntü kalitesi eşiği olarak ayarlayabilirsiniz (daha büyük sampleSize daha düşük görüntü kalitesidir). ait Dokümanlar

public static Bitmap loadBitmapSafety(int resDrId, Context context){ 
    return loadBitmapSafety(resDrId, 1, context); 
} 

private static Bitmap loadBitmapSafety(int resDrId, int sampleSize, Context context){ 
    BitmapFactory.Options ops = new BitmapFactory.Options(); 
    ops.inSampleSize = sampleSize; 

    try { 
     return BitmapFactory.decodeResource(context.getResources(), resDrId, ops); 

    } catch (OutOfMemoryError e) { 
     if (sampleSize == 4) 
      return null; 
     return loadBitmapSafety(resDrId, sampleSize +1, context); 

    } catch (Exception e){ 
     return null; 
    } 
} 
İlgili konular