2012-08-14 20 views
5

मैं एंड्रॉइड के लिए काफी नया हूं और एक गेम विकसित कर रहा हूं। प्रत्येक बार बार-बार मेरे पास memory exceptions से रिपोर्ट करने वाले उपयोगकर्ता हैं, जो मुझे लगता है कि मेरे द्वारा बनाए गए बिटमैप के आकार में 200 केबी आकार के बाद आश्चर्य की बात है। जब भी मैं नया sprite बनाता हूं तो मैं BitmapFactory.decodeResource() पर कॉल करता हूं। चूंकि मेरा आवेदन एक ज़ोंबी रक्षा खेल है, इसलिए आप उम्मीद कर सकते हैं कि मैं अक्सर sprites बनाते हैं।एंड्रॉइड: मेमोरी अपवाद से बाहर/डीकोड रिसोर्स वीएम बजट में कैसे जुड़ता है?

हर बार जब मैं एक स्प्राइट बनाता हूं, तो मैं बिटमैप उत्पन्न करने के लिए डीकोड संसाधन को कॉल करता हूं। मेरा सवाल यह है कि अगर मैं प्रत्येक एक्टिविटी की शुरुआत में केवल डीकोड संसाधन को कॉल करना चाहता था, और पैकेज स्तर पर बिटमैप का उल्लेख करता हूं, तो इससे वीएम बजट पर रखी गई स्मृति की मात्रा कम हो जाएगी?

उत्तर

18
  • जब आप png की तरह एक छवि संसाधन से बिटमैप डिकोड, यह छवि के आयाम के बारे में अधिक नहीं बल्कि उसके बाद केबीएस में आकार निर्भर करता है।
  • कोशिश करें कि क्या आप मूल रूप से अपने आउटपुट को प्रभावित किए बिना मूल छवि के आयामों को कम कर सकते हैं।
  • बिटमैप्स का पुन: उपयोग करने का प्रयास करें, फिर उन्हें डीकोड करना जारी रखें।
  • BitmapFactory.Options() ऑब्जेक्ट के साथ अधिक विकल्पों का अन्वेषण करें, उदाहरण के लिए SampleSize में वृद्धि छवि द्वारा आवश्यक स्मृति की मात्रा को कम कर सकती है। जैसे
     
    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); 
    
  • एक उपयोगी मुश्किल समाधान, अगर कोई अन्य अनुकूलन वास्तव में बाहर काम कर रहे हैं के लिए आप, आप OutOfMemoryException पकड़ कर सकते हैं और उसके बाद 16 को अधिकतम करने के लिए गुणवत्ता .. यानी inSampleSize की स्थापना को कम कर सकते यह कम हो जाएगा है आपकी छवियों की गुणवत्ता लेकिन कम से कम आपके एप्लिकेशन को क्रैश होने से बचाएगा, मैंने इसे अपने ऐप में से एक में किया था जहां मुझे बिटमैप में बड़ी एमपी छवि लोड करने की आवश्यकता थी।
+1

की डॉक्स से 'inPurgeable': ध्यान दें: यह झंडा जब' decodeResource (संसाधन, पूर्णांक, android.graphics.BitmapFactory.Options) 'या' decodeFile (स्ट्रिंग, android.graphics.BitmapFactory के साथ प्रयोग किया नजरअंदाज कर दिया है। विकल्प) '। –

0

संसाधन स्निपेट से छवि प्राप्त करने के लिए मेरा स्निपेट। आप छवि गुणवत्ता की दहलीज के रूप में अपना खुद का sampleSize सेट कर सकते हैं (बड़ा sampleSize कम छवि गुणवत्ता है)।

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; 
    } 
} 
संबंधित मुद्दे