2012-12-07 11 views
7

से रिलीज बिटमैप्स क्या कोई जानता है कि android.view.GLES20DisplayList से बिटमैप्स कैसे रिलीज़ करें। और यदि आप साफ करते हैं, तो यह उन्हें जीवित क्यों रखता है, मान लें, ImageView मैन्युअल रूप से? या शायद GLES20DisplayList को अक्षम करने का एक तरीका है, एंड्रॉइड का उपयोग करने का प्रयास किया गया: AndroidAccelerated = AndroidManifest में "false", अभी भी कोई भाग्य नहीं है।एंड्रॉइड.view.GLES20DisplayList

लग रहा है में केवल प्रभावित तरह 4,2 (1)

अद्यतन: (? बग) की तरह आप पर 4.2.1 हार्डवेयर त्वरण अक्षम नहीं कर सकता लग रहा है

साधारण परीक्षण:

Android manifest: 
application ... android:hardwareAccelerated="false" 

System.out.println("isHardwareAccelerated: " + mListView.isHardwareAccelerated()); 
mListView.setLayerType(LAYER_TYPE_SOFTWARE, null); 
System.out.println("isHardwareAccelerated: " + mListView.isHardwareAccelerated()); 

परिणाम:

12-06 17:15:27.129: I/System.out(30752): isHardwareAccelerated: true 
12-06 17:15:27.129: I/System.out(30752): isHardwareAccelerated: true 

उत्तर

3

यह ख रहा है 4.2 में एक स्मृति रिसाव। ऐसा लगता है कि इस फिक्स के खिलाफ इसका इरादा है: https://android.googlesource.com/platform/frameworks/base/+/034de6b1ec561797a2422314e6ef03e3cd3e08e0

मैंने गतिविधि के लिए 4.2 में मैनिफेस्ट में हार्डवेयर त्वरण को अक्षम किया जहां मुझे इस समस्या का सामना करना पड़ा, इससे एंड्रॉइड.view.GLES20DisplayList मेमोरी होल्डिंग में मदद मिली।

गतिविधि के लिए प्रकट में: android:hardwareAccelerated="@bool/gpu_enabled"

values.xml में v17 के लिए:

<bool name="gpu_enabled">false</bool> 

डिफ़ॉल्ट values.xml में, मैं यह सही पर सेट किया।

+1

ऐसा इसलिए होता है क्योंकि जब तक दृश्य हटा नहीं जाता है तब तक वे बिटमैप रखते हैं। GLES20DisplayList से टिप्पणी यहां दी गई है: /* ये सूचियां सुनिश्चित करती हैं कि डिस्प्लेलिस्ट द्वारा रिकॉर्ड किए गए किसी भी बिटमैप्स और डिस्प्लेलिस्ट को तब तक जीवित रखा जाता है जब तक डिस्प्लेलिस्ट जीवित रहता है। बिटमैप और डिस्प्लेलिस्ट सूचियां GLES20RecordingCanvas द्वारा उपयुक्त ड्राइंग कॉल के दौरान पॉप्युलेट की जाती हैं और एक नए ड्राइंग फ्रेम की शुरुआत में या विंडो से दृश्य को अलग होने पर साफ़ कर दिया जाता है। */मूल रूप से आपको बिटमैप/ड्रायबल रीसायकल करने में सक्षम होने के लिए अलग-अलग दृश्य की आवश्यकता है। – vovkab

+0

मैंने ऑनस्टॉप में विचारों को हटा दिया, फिर भी स्मृति को आयोजित किया जा रहा था। (केवल 4.2 पर) –

+0

क्या स्मृति विश्लेषक दिखाता है? शायद कोई और संदर्भ रख रहा है या संदर्भ लीक हो गया है? ImageViews से पूरी तरह से बिटमैप्स को साफ़ करने का प्रयास करें और फिर दृश्य को अलग करें। – vovkab

1

मैंने हाल ही में इस मुद्दे के बारे में गहराई से स्मृति विश्लेषण किया है। चूंकि यूलिया ने ऊपर बताया, हार्डवेयर त्वरण को अक्षम करने से आम तौर पर चाल चलती है। वैकल्पिक रूप से, आप ImageView के Drawable को शून्य पर सेट कर सकते हैं, बिटमैप रीसायकल कर सकते हैं, या इमेज व्यू को अलग कर सकते हैं जैसा आपने बताया था।

हालांकि, एपीआई संस्करण के आधार पर, बिटमैप मेमोरी GLES20DisplayList से रिलीज़ हो सकती है या नहीं भी हो सकती है। मैंने my blog post – Android Bitmap Memory Analysis पर गहराई से इन विभिन्न व्यवहारों और संभावित समाधानों पर चर्चा की, लेकिन त्वरित समाधान हार्डवेयर त्वरण को अक्षम करना होगा।

+1

आपके ब्लॉग पोस्ट के लिए धन्यवाद, यह वास्तव में समस्या को पूरी तरह से समझने में मदद करता है –