2009-10-08 10 views
7

कुछ समय पहले मैंने एक लिखने योग्य बिटमैप मेमोरी रिसाव से संबंधित एक प्रश्न पोस्ट किया था, और हालांकि मुझे समस्या से संबंधित अद्भुत टिप्स प्राप्त हुए, मुझे अभी भी लगता है कि एक गंभीर बग/(मेरे द्वारा बनाई गई गलती)/(भ्रम)/(कुछ और बात) यहाँ।लिखने योग्य बिटमैप का निपटान कैसे करें? (डब्ल्यूपीएफ)

तो, यहाँ फिर से मेरी समस्या है:

मान लीजिए हम आपको छवि और एक बटन के साथ एक WPF आवेदन किया है। छवि का स्रोत वास्तव में एक बड़ा बिटमैप (3600 * 4800 पीएक्स) है, जब इसे रनटाइम पर दिखाया जाता है तो आवेदक ~ 90 एमबी का उपभोग करता है।

अब मान लीजिए कि मैं छवि के स्रोत (वास्तव में बड़ी छवि) से लिखने योग्य बिटमैप को तुरंत चालू करना चाहता हूं, जब ऐसा होता है तो अनुप्रयोग ~ 220 एमबी का उपभोग करते हैं।

अब मुश्किल भाग आता है, जब छवि में संशोधन (लिखने योग्य बिटमैप के माध्यम से) अंत में, और लिखने योग्य बिटमैप (कम से कम जिन्हें मैं जानता हूं) के सभी संदर्भ नष्ट हो जाते हैं (एक विधि के अंत में या उन्हें शून्य पर सेट करके) लिखने योग्य बिटमैप द्वारा उपयोग की जाने वाली मेमोरी को मुक्त किया जाना चाहिए और एप्लिकेशन खपत ~ 90 एमबी पर वापस आनी चाहिए। समस्या यह है कि कभी-कभी यह लौटता है, कभी-कभी ऐसा नहीं होता है। संदर्भ स्थानीय है और स्मृति विधि के अंत (या कचरा कलेक्टर ऐसा करने का फैसला करता है जब) पर जारी की जानी चाहिए जैसा कि आप देख सकते हैं

// The Image's source whas set previous to this event 
private void buttonTest_Click(object sender, RoutedEventArgs e) 
    { 
     if (image.Source != null) 
     { 
      WriteableBitmap bitmap = new WriteableBitmap((BitmapSource)image.Source); 

      bitmap.Lock(); 

      bitmap.Unlock(); 

      //image.Source = null; 
      bitmap = null; 
     } 
    } 

:

यहाँ एक नमूना कोड है। हालांकि, ऐप ब्रह्मांड के अंत तक ~ 224 एमबी का उपभोग कर सकता है।

कोई भी मदद महान होगी।

उत्तर

0

क्या बिटमैप छवि को उसी रिज़ॉल्यूशन और पिक्सल पर प्रस्तुत करना आवश्यक है? आप पिक्सेल के बहुत कम सेट पर writeablebitmap बना सकते हैं और रेंडर विधि को कॉल कर सकते हैं। चूंकि लिखने योग्य बिटमैप में रेंडर कॉल करते समय मूल uielements का संदर्भ होता है, इस मामले में, आपके पास 3 भाग होंगे: 1) मूल uielement, 2) writeablebitmap में पिक्सल, 3) प्रतिलिपि मूल के संदर्भ।

मैं मेमोरी लीक करने के मामले में WriteableBitmap के साथ एक समान मुद्दा था और मैं इस लिंक बाहर की जाँच से यह तय हो: http://www.wintellect.com/CS/blogs/jprosise/archive/2009/12/17/silverlight-s-big-image-problem-and-what-you-can-do-about-it.aspx

यदि आप किसी अन्य WriteableBitmap बना सकते हैं और अधिक पिक्सेल कॉपी है, तो पहले WriteableBitmap के निपटान आपको कुछ स्मृति रिलीज देखना चाहिए - कम से कम मैंने अपने परिदृश्य में किया था।

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