2011-08-28 11 views
5

मैं एक ब्लैकजैक प्रोग्राम विकसित कर रहा हूं जो ब्लैकजैक टेबल, कार्ड इत्यादि दिखाता है। योजना यह है कि यह एक स्वचालित रणनीति के साथ एक के बाद हजारों हाथों को खेलेंगे।सी # डब्ल्यूपीएफ बिटमैपसोर्स मेमोरी लीक?

मेरे पास प्लेयरशॉट उपयोगकर्ता नियंत्रण है जिसमें एक ऑब्जेर्जेबल कोलेक्शन के लिए एक आइटम नियंत्रण है। इस कार्डइनहैंड क्लास में बिटमैपसोर्स नाम कार्डमैमेज है। जब उदाहरण crated है यह निम्नलिखित कोड का उपयोग कर संसाधनों से कार्ड छवि लोड:

[System.Runtime.InteropServices.DllImport("gdi32.dll")] 
public static extern bool DeleteObject(IntPtr hObject); 

private BitmapSource GenerateCardImage() { 
     Stream TempStream = this.GetType().Assembly.GetManifestResourceStream("BlackJack.Resources.CardImages.Card_" + m_Card.ShortTitle + ".gif"); 
     System.Drawing.Bitmap sourceBMP = new System.Drawing.Bitmap(TempStream); 
     BitmapSource tempBitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
      sourceBMP.GetHbitmap(), 
      IntPtr.Zero, 
      System.Windows.Int32Rect.Empty, 
      BitmapSizeOptions.FromWidthAndHeight(sourceBMP.Width, sourceBMP.Height) 
     ); 
     TempStream.Dispose(); 
     DeleteObject(sourceBMP.GetHbitmap()); 
     return tempBitmapSource; 
} 

समस्या यह है कि उसके बाद मैं ~ 500 राउंड (~ 4000 हाथों या ~ 10000 कार्ड) मैं एक GDI के साथ अंत के माध्यम से चलाने + त्रुटि और ~ 400 एमबी रैम लेने वाला आवेदन। यह तेजी से बढ़ता है और खेला गया हाथों की संख्या से संबंधित है।

DeleteObject() कुछ ऐसी साइट है जो मुझे दूसरी साइट पर मिली थी, जिसमें कहा गया था कि बिटमैप से संसाधनों को रिहा करने का यह सबसे अच्छा तरीका है। यह एक छोटा सा प्रभाव हो सकता है, लेकिन जो मैं खोज रहा हूं वह नहीं। मैंने निपटान() का भी प्रयास किया है।

एक अन्य साइट ने कहा कि इसे आइटमसोर्स बाइंडिंग के साथ करना था। मैंने बाध्यकारी और स्मृति अभी भी हटा दी है। उलटा मैं बाध्यकारी छोड़ दिया और बिटमैप उत्पन्न कोड को हटा दिया। इसने 40,000 राउंड खेले और काफी हद तक नहीं बढ़े (शायद 40 मिनट से अधिक +20 एमबी चल रहा था)।

ऑब्जर्वेबल कोलेक्शन प्रत्येक दौर के बाद साफ़() एड है। मैंने संग्रह, कार्डइनहैंड, और बिटमैपसोर्स प्रोपरी को कम करने की कोशिश की है, इसका कोई फायदा नहीं हुआ है।

मैं इन छवियों को स्क्रीन पर प्रदर्शित करने की अनुमति कैसे दे सकता हूं लेकिन यह भी सुनिश्चित कर सकता हूं कि उनकी ऑब्जेक्ट्स की आवश्यकता नहीं होने के बाद प्रोपेरी नष्ट हो गई है?

आपके समय के लिए धन्यवाद।

उत्तर

6

तो पहले बंद, आपके पास केवल 52 कार्ड हैं। बस छवियों को सामने बनाएं और उन्हें एप्लिकेशन के जीवन के लिए चारों ओर रखें। यह सब के बाद एक ब्लैक जैक खेल है; यह मानना ​​सुरक्षित है कि प्रत्येक कार्ड की आवश्यकता एक बिंदु या दूसरे पर होगी।

उस ने कहा, धाराओं से BitmapSource ऑब्जेक्ट्स बनाने के साथ कोई समस्या है। स्ट्रीम द्वारा आयोजित byte[] स्ट्रीम को निपटाया जाने पर मुक्त नहीं किया जा रहा है। See my own question here। डुप्लिकेट के रूप में बंद करने के लिए वोट देने का एकमात्र कारण यह नहीं है क्योंकि मुझे लगता है कि आपको वास्तव में केवल कार्ड बनाना चाहिए और इन छवियों को 10,000+ बार बनाने के बजाय इसके साथ किया जाना चाहिए।

+0

यह समझ में आता है। यदि मैं एप्लिकेशन स्टार्टअप पर बिटमैपसोर्स उत्पन्न करता हूं तो मुझे बस उस संदर्भ को संदर्भित करने में सक्षम होना चाहिए? यह केवल कार्डइनहैंड कक्षा में मूल बिटमैप स्रोत का संदर्भ संग्रहीत करेगा, और डेटा को डुप्लिकेट नहीं करेगा, है ना? –

+0

51 कार्ड? 52? ... –

+0

.... गीज़, हाँ ... 52. प्वाइंट स्टैंड = डी –

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