2012-08-14 11 views
5

Jestem całkiem nowym użytkownikiem Androida i rozwijałem grę. Od czasu do czasu mam zgłoszenie użytkowników z poziomu memory exceptions, co jest dla mnie zaskakujące, ponieważ utworzone przeze mnie bitmapy mają rozmiar co najwyżej 200 kb. Dzwonię pod numer BitmapFactory.decodeResource(), gdy tylko utworzę nowy sprite. Ponieważ moja aplikacja to gra obrony zombie, możesz spodziewać się, że dość często tworzę sprite'y.Android: Wyjątek dotyczący braku pamięci/w jaki sposób decodeResource dodaje się do budżetu maszyny wirtualnej?

Za każdym razem, gdy utworzę sprite, wywołuję zasób dekodowania w celu wygenerowania bitmapy. Moje pytanie brzmi, czy gdybym miał tylko wywołać zasoby dekodowania na początku każdego działania i odnieść się do mapy bitowej na poziomie pakietu, czy zmniejszyłoby to ilość pamięci umieszczonej na budżecie VM?

Odpowiedz

18
  • Podczas dekodowania bitmap z zasobu obrazu jak PNG, to zależy bardziej od wymiarów obrazu a następnie rozmiar w KBs.
  • Spróbuj, jeśli możesz zmniejszyć wymiary oryginalnego obrazu bez faktycznego wpływu na wydruki.
  • Spróbuj ponownie użyć map bitowych, a następnie dekodować je.
  • Zbadaj więcej opcji za pomocą obiektu BitmapFactory.Options(), na przykład zwiększenie inSampleSize może zmniejszyć ilość pamięci wymaganej przez obraz. np
     
    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); 
    
  • Jeden użyteczne rozwiązanie trudne, jeśli żadne inne optymalizacje są naprawdę pracuje dla Ciebie jest to, że można złapać OutOfMemoryException a następnie może obniżyć jakość do max .. czyli zachodzące inSampleSize do 16. Będzie to zmniejszyć jakość twoich obrazów, ale przynajmniej uratuje twoją aplikację przed awarią, zrobiłem to w jednej z moich aplikacji, gdzie musiałem załadować ogromny obraz MP w bitmapie.
+1

Od docs 'inPurgeable': Uwaga: Ta flaga jest ignorowana, gdy używana z' decodeResource (Zasoby, int, android.graphics.BitmapFactory.Options) 'lub' decodeFile (łańcuch, android.graphics.BitmapFactory. Opcje) '. –

0

Mój fragment służący do uzyskania obrazu z bezpieczeństwa zasobów. Możesz ustawić własny sampleSize jako próg jakości obrazu (większa sampleSize jest niższa jakość obrazu).

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; 
    } 
} 
Powiązane problemy