2012-12-19 12 views
9

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

bitmap.recycle() 
bitmap = null 

System.gc (also tried Runtime.getRuntime().gc()) 

, वहाँ किसी भी तरह से जल्दी स्मृति से बिटमैप्स अनलोड करने के लिए है या यह किसी भी तरह की जांच करने के लिए संभव है यदि वे वास्तव में तो मैं लोड हो रहा है स्क्रीन बना सकते हैं मंजूरी दी जाती है पर निर्भर करते हैं: मैं इस समय कुछ इस तरह कर रहा हूँ वह भी?

+2

आप अपने आप को रोल करने के बजाय मौजूदा बिटमैप कैशिंग इंजन का उपयोग करने पर विचार कर सकते हैं: http://www.senab.co.uk/2012/12/18/android-bitmapcache-the-rebirth/ – CommonsWare

+1

कारण यह धीमा है क्या आप जीसी को बुला रहे हैं। आवश्यकता होने पर इसे चलाने दें। +1 @ कॉमन्सवेयर को पहिया को फिर से शुरू करने की आवश्यकता नहीं है। – iagreen

+4

कॉलिंग।रीसायकल() और इसे शून्य पर सेट करना वास्तव में ऐसा करना चाहिए। कॉल करने की कोई ज़रूरत नहीं है। जीसी() :) –

उत्तर

0

जैसा कि सिल्वेन ने कहा, System.gc और दोस्त पूर्ण कचरा इकट्ठा करते हैं और काफी धीमे हो सकते हैं। जावा मशीन समय-समय पर जीसी चलाती है, और किसी निश्चित पल में कितनी मुफ्त मेमोरी उपलब्ध है, इस पर निर्भर करता है कि अवधि समाप्त हो जाती है।

मेरे लिए सबसे अच्छा विकल्प किसी प्रकार का बिटमैप पूलिंग का उपयोग करना है: प्रीफैब बिटमैप उदाहरणों का एक सेट जो आप पूल से प्राप्त कर सकते हैं और एलआरयू नीतियों को लागू करने वाले कैश में बफर इंस्टेंस प्रबंधित कर सकते हैं।

उचित समापन के साथ, आप बिटमैप उदाहरणों को बनाने और नष्ट करने पर शून्य लागत प्राप्त कर सकते हैं क्योंकि उन्हें पूल किया जाता है, और बफर उदाहरणों को बिटमैप डेटा युक्त गतिशील रूप से उपयोग के आधार पर स्मृति से लोड और अनलोड किया जाएगा।

1

कोई गारंटी नहीं है कि जब हम System.gc() के लिए प्रयास करते हैं तो कचरा कलेक्टर वास्तव में चलाया जाएगा क्योंकि जीसी() संसाधन संसाधन भूख जैसी कुछ पूर्व शर्त की अपेक्षा करता है। तो यह काफी स्पष्ट है कि जीसी() को कॉल करना महत्वपूर्ण सीपीयू चक्रों को बर्बाद कर रहा है। एक डेवलपर के रूप में हम संदर्भों को रद्द करके जीसी एकत्रित करने के लिए अनावश्यक वस्तुओं को बना सकते हैं।

कुछ अनुकूलन तकनीकें हैं जो गेमिंग सिस्टम (गेम) बनाते समय सहायक हो सकती हैं।

  1. बनावट का उपयोग करें। यहां एक example है।

  2. स्प्राइट और स्प्राइटशीट्स का उपयोग करें (यह अलग-अलग बिटमैप्स लोड करने से सिस्टम को कम ओवरहेड देता है)। कई ओपन सोर्स गेम इंजन हैं जो इसका उपयोग करते हैं। अगर आप उनका उपयोग नहीं करना चाहते हैं तो इन स्रोतों से स्क्रैच से कैसे बनाएं।

  3. बिटमैप के बेहतर उपयोग के लिए Loading Large Bitmaps Efficiently और Caching Bitmaps के लिए इन मानक एंड्रॉइड दस्तावेज़ का उपयोग करें। विचार यह है कि जब उपयोगकर्ता डिवाइस प्रसंस्करण की मात्रा को संभालने के लिए पर्याप्त कुशल नहीं है और/या आपके गेम के लिए स्मृति कम है तो आप हमेशा बिटमैप को स्केल कर सकते हैं (बेहतर प्रतिक्रिया के लिए गुणवत्ता के साथ समझौता)।

  4. हमेशा मेमोरी लीक समस्याओं के खिलाफ अपने ऐप का परीक्षण करें। यहां एक nice post है जो सहायता करेगा।

  5. इनमेमरी रखें (एक बार उपयोग न करें) आइटम जो एक ही दृश्य में गेम के अंदर कई बार उपयोग किए जाते हैं। कारण स्मृति में छवियों को लोड करने में काफी समय लगता है।

आशा है कि यह आपकी मदद करेगा।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^