2012-11-10 30 views
11

लोग, मुझे नहीं लगता है कि कि इस डुप्लिकेट है और नहीं उन है कि कैसे मैं ooms सवालों से बचने कर में से एक है। यह ज्ञान के लिए एक वास्तविक खोज है इसलिए कृपया उन वोटों पर रोक दें ...क्यों एंड्रॉयड की जरूरत की तुलना में अधिक स्मृति को आबंटित करता है जब छवियों को लोड

कल्पना कीजिए कि मेरे पास पिक्सल का JPEG है। मैं इसे ARGB_8888 के रूप में लोड करता हूं जो "bad as it gets" के रूप में है।

मैं एंड्रॉयड 500x500x4 bytes = a little under 1MB आवंटित करने के लिए हालांकि, एक ढेर पर देखने के डंप और आपको लगता है कि एंड्रॉयड आवंटित काफी अधिक है, अक्सर 5-10 गुना अधिक के कारकों देखेंगे उम्मीद करेंगे।

आप अक्सर यहाँ के बारे में OOMS जहां स्टैक ट्रेस एक heap request of say 15MB से पता चलता पर सवाल देख सकते हैं और यह हमेशा बहुत बड़ा की तुलना में छवि के बाइट्स धारण करने के लिए बस आवश्यक है। ओपी आमतौर पर कुछ डाउनवॉट्स को पकड़ता है, फिर कम जवाब (धन्यवाद रोमैन!) और स्केलिंग में उपयोग के बारे में स्टॉक उत्तरों और टिप्पणियों के साथ बमबारी होती है। मुझे लगता है कि यहां आंखों की तुलना में कहीं अधिक है।

कोई भी जानता है कि यह क्यों है?

यदि कोई स्पष्ट उत्तर नहीं है, तो मैं SSCCE को एक साथ रखूंगा यदि यह मदद करता है।

पीएस। मुझे लगता है कि जेपीईजी बनाम पीएनजी इत्यादि अप्रासंगिक है क्योंकि हम बैकिंग बिटमैप के मेमोरी उपयोग के बारे में बात कर रहे हैं जो बस x बार y बार बीपीपी है - या क्या मैं धीमा हूं?

+4

क्या आप सुनिश्चित हैं कि आप इसे लागू करने के तरीके से छवि को स्केल नहीं कर रहे हैं (उदाहरण के लिए, इसे 'छवि दृश्य' में लोड करना जो समान आयाम नहीं है)? इसके अलावा, जब आप अपने ढेर डंप को देखते थे, तो आपको सटीक रूप से देखना चाहिए कि "5-10 गुना अधिक कारक आवंटन" कहां गए थे - आप उन मानों को हवा कहां देखते थे? "यदि यह मदद करता है तो मैं एक एसएससीसीई एक साथ रखूंगा" - कृपया करें। – CommonsWare

+0

आह। ऐसा लगता है कि मैं धीमा हो सकता है। मुझे एक उदाहरण आज़माएं और वापस आएं और जब मुझे लगता है कि यह लागू होने पर स्केलिंग नहीं कर रहा है। धन्यवाद – Simon

+0

विचित्र रूप से पर्याप्त, [इस सवाल] में आदमी (http://stackoverflow.com/questions/4866653/read-in-jpg-as-rgb888-on-android) * चाहता है * और ARGB8888, लेकिन एक RGB565 प्राप्त करता रहता है । शायद आप उसकी विधि का उपयोग कर सकते हैं? – GolezTrol

उत्तर

1

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