2012-02-13 12 views
8

मैं समझने की कोशिश कर रहा हूं कि मेरी छवियां क्यों नहीं हैं, इसलिए मैंने WPF प्रदर्शन का परीक्षण करने के लिए नमूना बनाया। मैंने गणना करने के लिए टाइमर का उपयोग किया कि मेरी "डिस्प्ले इमेजेस" इवेंट हैंडलर कितनी देर तक निष्पादित है, और स्क्रीन पर दिखाई देने वाली छवियों को कितनी देर तक ले जाने के लिए एक स्टॉप घड़ी का इस्तेमाल किया। निचली पंक्ति: 100, 1600, 2500 और 3600 छवियों को प्रदर्शित करते समय, डब्ल्यूपीएफ ने के बाद 2, 9, 12 और 16 सेकंड लिया, मेरा कोड स्क्रीन पर छवियों को प्रदर्शित करने के लिए समाप्त हो गया था। तो मुझे असहाय लगता है: ऐसा लगता है कि छवियों को तेज़ी से प्रकट करने के लिए मैं अपना कोड सुधार नहीं सकता - मुझे WPF के साथ कुछ करने की ज़रूरत है!डब्ल्यूपीएफ बिटमैप प्रदर्शन

तो मेरा प्रश्न है: छवियों को तेज़ी से प्रदर्शित करने के लिए मुझे अलग-अलग करने की क्या ज़रूरत है?


परीक्षण सेटअप सरल है:

खिड़की एक ग्रिड में शामिल है। बाद "परीक्षण" बटन क्लिक किया जाता है, पंक्ति और स्तंभ परिभाषाएँ इस प्रकार added.Then एक छवि ग्रिड की प्रत्येक कोशिका में जोड़ा जाता है कर रहे हैं:

  var image = new Image(); 
      image.BeginInit(); 
      image.Name = ImageNameFromCell(theRow, theColumn); 
      image.Stretch = Stretch.None; 
      image.HorizontalAlignment = HorizontalAlignment.Center; 
      image.VerticalAlignment = VerticalAlignment.Center; 
      RenderOptions.SetBitmapScalingMode(image, BitmapScalingMode.LowQuality); 
      image.EndInit(); 

      theGrid.Children.Add(image); 

अंत में, प्रत्येक चित्र का स्रोत एक बिटमैप के लिए सेट है: एक ग्रे-स्केल छवि पहले ही अनुमानित स्क्रीन आकार तक सीमित हो गई है। बिटमैप निम्नानुसार उत्पन्न होता है:

  var smallerBitmapImage = new BitmapImage(); 
      smallerBitmapImage.BeginInit(); 
      smallerBitmapImage.DecodePixelWidth = (int)(theImageWidth); 
      smallerBitmapImage.UriSource = theUri; 
      smallerBitmapImage.CacheOption = BitmapCacheOption.None; 
      smallerBitmapImage.EndInit(); 

      //BitmapFrame bitmapFrame = BitmapFrame.Create(this.FullPath); 

      var convertedBitmap = new FormatConvertedBitmap(); 
      convertedBitmap.BeginInit(); 
      convertedBitmap.Source = smallerBitmapImage; 
      convertedBitmap.DestinationFormat = PixelFormats.Gray16; 
      convertedBitmap.EndInit(); 
      convertedBitmap.Freeze(); 

तो, मैं अपने wits अंत में हूँ। छवियां एक उल्लेखनीय देरी के साथ दिखाई देती हैं, और ऐसा लगता है कि यह मेरे नियंत्रण से बाहर है। मैं क्या कर सकता हूँ?

उत्तर

3

प्रकट होता है क्या फर्क पड़ा है, ऑनलोड करने के लिए छवि के कैश विकल्प स्थापित कर रही है

smallerBitmapImage.CacheOption = BitmapCacheOption.OnLoad;

यह काम मेरे ईवेंट हैंडलर में ले जाया गया, इसलिए अब मैं पृष्ठभूमि में ऐसा करने के लिए प्री-फ़ेचिंग का उपयोग कर सकता हूं।

3

क्या आप वास्तव में एक ही समय में उन सभी छवियों को देखते हैं? यदि नहीं, तो आप वर्चुअलाइजिंग पैनल के साथ कुछ ItemsControl का उपयोग कर सकते हैं, इसलिए केवल छवियों को देखने में प्रदर्शित किया जाता है।

तुम भी एक बेहतर विकोडक, जो शायद एक व्यर्थ प्रयास है लिखने के लिए कोशिश कर सकते (पैनलों की बात करते हुए अपने मौजूदा सेटअप भी एक ItemsControl एक UniformGridpanel के रूप में उपयोग करता है जो साथ प्रतिस्थापित किया जा सकता है)।

+0

आपके उत्तर के लिए धन्यवाद, एचबी। हां, मैं एक ही समय में उन सभी छवियों को देखना चाहता हूं। 1600, 2500 और 3600 मामले परीक्षण के लिए थे, इसलिए मैं घड़ी के सेकंड के हाथों से आसानी से डब्ल्यूपीएफ की देरी को माप सकता था, लेकिन मैं कहूंगा कि 400 छवियां एक संख्या है जिसे मैं समर्थन देना चाहता हूं। और "बेहतर डिकोडर" श्वास को फिर से चलाएं, मैंने सोचा था कि उपरोक्त "छोटे बिटमैप छवि" कोड में पहले से ही डीकोडिंग किया गया था, यानी मेरे कोड में और जब डब्लूपीएफ मेरे ईवेंट हैंडलर रिटर्न के बाद जो भी करता है, वह समय है, मैं छोटा करने की कोशिश कर रहा हूं ... – Avi

+1

@Avi: ओह ठीक है, क्योंकि फाइल संभवतः स्थानीय हैं, डिकोडिंग सिंक्रनाइज़ हो सकती है लेकिन मुझे आंतरिक के बारे में निश्चित नहीं है; यह देखते हुए कि रूपांतरण अपवाद नहीं फेंकता है कि धारणा व्यवहार्य लगता है हालांकि। यदि यह शुद्ध प्रतिपादन समय पर आता है तो आप वास्तव में बाध्य हो सकते हैं क्योंकि आप पहले से ही ऐसा सब कुछ कर रहे हैं जो स्केलिंग को रोकने के लिए चीजों को छोटे आकार में डीकोडिंग से गति दे सकता है। पता नहीं आप और क्या कर सकते हैं :( –

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