मुझे WPF में बिटमैप्स हैंडलिंग को अनुकूलित करने के लिए कई पैटर्न मिले। हालांकि, मैं समझ नहीं पा रहा हूं कि प्रत्येक पैटर्न का उपयोग कब करें। जैसा कि मुझे लगता है कि यह एक आम समस्या है, मैंने सारांशित किया कि मैं क्या समझता हूं और मुझे क्या लगता है और आपकी मदद के लिए पूछता है। आप पैटर्न जोड़ सकते हैं, कि वे किस तरह भिन्न होते हैं, की व्याख्या करता है, तो वे CPU या GPU का उपयोग समझाने, और जब उपयोग करने के लिए सिखाने प्रत्येक और उन्हें गठबंधन करने के लिए कैसे, यह एक जबरदस्त मदद होगी !बिटमैप प्रदर्शन-अनुकूलन पैटर्न
प्रसंग - छवियाँ "ग्रिड" परिदृश्य:
मेरा आवेदन कई बिटमैप छवियों को प्रदर्शित करने की है। छवियों को पंक्तियों और कॉलम ग्रिड जैसी संगठन में स्क्रीन पर प्रदर्शित किया जाता है (आवश्यक रूप से ग्रिड या यूनिफॉर्मग्रिड कक्षाएं नहीं, विंडो मीडिया प्लेयर के एल्बम दृश्य को सोचें)। छवियां विभिन्न ग्रिड कोशिकाओं के बीच स्थानांतरित हो सकती हैं। मनमानी कोशिकाओं पर कुछ छवियों को दूसरों द्वारा प्रतिस्थापित किया जा सकता है। छवियों को क्लिक करने योग्य होना चाहिए, एक संदर्भ मेनू प्रदान करना चाहिए, चयन योग्य, ड्रैग-सक्षम आदि होना चाहिए। दूसरे शब्दों में, "छोटे बगर्स को एक बड़े बिटमैप में गठबंधन करें" लागू नहीं है, कम से कम निष्क्रिय नहीं है।
पैटर्न 0: हैक
एक बिटमैप में छोटे buggers गठबंधन है, और पृष्ठभूमि के रूप में उपयोग (कैसे संदर्भ ड्राइंग??)। खाली सामग्री वाली छवियों के साथ इसे ओवरले करें जो हिट, संदर्भ मेनू, इवेंट इत्यादि को संभालेगा।
लाभ यह है कि हम केवल दो बिटमैप बोल रहे हैं: वर्तमान में प्रदर्शित एक और जिसे इसे प्रतिस्थापित करना चाहिए। यह वास्तव में तेज़ होना चाहिए। हालांकि, मेरे वर्षों के अनुभव खतरे के लाल झंडे को बढ़ाते हैं। आपकी टिप्पणी?
पैटर्न 1: कम छवि का आकार
यह एक नहीं brainer है जब आप छवि आकार के आकार बदलने के लिए पहले से पता है, और होता है जब आप प्रदर्शन के लिए विवरण (रंग) कम करने के लिए तैयार हैं:
- BitmapImage.DecodePixelWidth
- का उपयोग कर FormatConvertedBitmap.DestinationFormat का उपयोग कर रंग जानकारी
- सेट कम बिटमैप आकार कम नियंत्रण के स्केलिंग व्यवहार रों इमेटिंग इमेज। स्ट्रेच को स्ट्रेच करें।
- छवि के लिए SetBitmapScalingMode को निम्न गुणवत्ता में सेट करें।
- मैथुन
देखें कोड here फ्रीज।
पैटर्न 2: पृष्ठभूमि प्री-फ़ेच
यह पैटर्न लागू होता है जब आपको लगता है आप उपयोगकर्ता स्क्रीन पर छवियों को एकटक का लाभ ले सकते हैं, और प्रदर्शित करने के लिए आगे अगले छवियों तैयार करते हैं। मेमोरी ओवरहेड के अलावा, आपके प्रोजेक्ट के लिए विपक्ष यह है कि इसे नेट फ्रेमवर्क 4 लक्ष्य का समर्थन करना है, न केवल क्लाइंट प्रोफाइल, ताकि क्लाइंट के इंस्टॉलेशन हो। आपको एसिंक प्रोग्रामिंग दर्द का सामना करना पड़ेगा।
इस पैटर्न में आप छवि नियंत्रणों की बिल्कुल आवश्यक संख्या बनाते हैं। जब बिटमैप को जोड़ने की आवश्यकता होती है, स्थानांतरित या हटा दिया जाता है तो आप केवल छवि नियंत्रण 'बिटमैप स्रोतों को संशोधित करते हैं)। एक पृष्ठभूमिवर्कर कार्य बिटमैप स्रोत (पूर्व में) "उपरोक्त छवि आकार" पैटर्न का उपयोग करके और उन्हें मेमोरी कैश में डालने के लिए ज़िम्मेदार है।
इस काम के लिए आपको बिटमैप इमेज के कैशऑप्शन को ऑनलोड पर सेट करना होगा, ताकि काम पृष्ठभूमि कार्यकर्ता से ऑफ-लोड हो।
पैटर्न 3: आरेखण संदर्भ
यह MSDN WPF मंच here पर Microsoft समर्थन से शेल्डन ziao द्वारा सुझाव दिया गया था। आदम नाथन के डब्ल्यूपीएफ 4 में पेज 4 9 4, अध्याय 15 "2 डी ग्राफिक्स" देखें DrawingContext के विवरण के लिए खुलासा। मैं नहीं कह सकता कि मैं इसे समझता हूं। here के उत्तर के अनुसार, मुझे लगता है कि यह ज्यामिति चित्रों को संभालने में सुधार करेगा, बिटमैप्स नहीं। इसके बाद, मुझे नहीं लगता कि यह छवियों के लिए फोकस और घटनाओं की आवश्यकताओं का समर्थन करेगा (फोरम में बेहतर आवश्यकताओं को समझाने के लिए मेरा बुरा) इसके अलावा, मैं पुस्तक की सारांश वाक्य से चिंतित हूं: "ध्यान दें कि DrawingContext का उपयोग इस तथ्य को नहीं बदलेगा कि आप एक बनाए रखा मोड सिस्टम के भीतर काम कर रहे हैं। निर्दिष्ट चित्र तुरंत नहीं होता है; आदेशों को WPF द्वारा तब तक जारी रखा जाता है जब तक उनकी आवश्यकता न हो। "इसका मतलब है कि एक बार हमारे हैंडलर फिर भी हम" बैकग्राउंड प्री-फ़ेच "जैसे समांतरता का लाभ नहीं उठा सकते हैं।
पैटर्न 4: लेखनीय बिटमैप
MSDN प्रलेखीकरण here एक दोहरी बफर प्रणाली के रूप में वर्णन: अपने यूआई धागा बफर अद्यतन करता है; डब्ल्यूपीएफ का रेंडर थ्रेड इसे वीडियो मेमोरी में ले जाता है।
इच्छित उपयोग (here देखें) बिटमैप्स के लिए है जो वीडियो मूवी जैसे प्रदर्शन में बहुत कुछ बदलता है। मुझे यकीन नहीं है, लेकिन संभव है कि इसे हैक किया जा सके और बैकग्राउंड प्री-फ़ेच पैटर्न के साथ जोड़ा जा सके और ग्रिड परिदृश्य में उपयोग किया जा सके।
पैटर्न 5: कैश्ड बिटमैप
MSDN (here) पर ज्यादा नहीं जानकारी। डब्ल्यूपीएफ फोरम आर्काइव (here) पर यह समझाया गया है कि "बिटमैप कैश एपीआई को वीडियो मेमोरी में आपकी सामग्री को कैश करने के लिए डिज़ाइन किया गया है (हार्डवेयर में प्रतिपादन करते समय), जिसका अर्थ है कि यह आपके जीपीयू पर निवासी रहता है। यह आपको स्क्रीन पर खींचते समय उस सामग्री को दोबारा प्रस्तुत करने की लागत बचाता है। "यह एक अच्छा विचार की तरह लगता है। मुझे यकीन नहीं है, हालांकि, नुकसान क्या हैं और इसका उपयोग कैसे करें।
पैटर्न 6: RenderTargetBitmap
RenderTargetBitmap एक बिटमैप करने के लिए एक दृश्य बदल देता है। मुझे यकीन नहीं है कि यह यहां प्रासंगिक है या नहीं। here देखें।
संपादित: पॉल Hoenecke प्रश्न के बारे में: मैं लिखा है कि "मेरा आवेदन कई बिटमैप iages प्रदर्शित करने के लिए है।" मैं उल्लेख करने में असफल रहा कि मुझे 800 छवियों को समवर्ती प्रदर्शित करने की आवश्यकता है।
एक मेरी अतः सवाल पर शामिल प्रदर्शन के मुद्दों WPF Bitmap performance और How can I make displaying images on WPF more “snappy”?
मैं पैटर्न 1 के वर्णन में बदलाव कर दिया है अवधारणा है कि छवि नियंत्रण बनाया या नष्ट कर दिया (जब तक कि हम चाहते हैं नहीं कर रहे हैं उजागर करने के लिए के बारे में पढ़ सकते हैं एक बड़ा या छोटा ग्रिड प्रदर्शित करने के लिए)। केवल उनके स्रोत अलग-अलग, नए या शून्य बिटमैप स्रोत पर सेट हैं।
संपादित करें: This question as posted on the WPF support forum, एमएस कर्मियों के कुछ उत्तरों के साथ।
आप कितनी छवियों की उम्मीद कर रहे हैं? मैंने एक ऐप बनाया है जो पहले हजारों छवियों का ग्रिड दिखाता है। हमने वर्चुअल-मोड सूचीबॉक्स का उपयोग किया; चूंकि उपयोगकर्ता नीचे स्क्रॉल करता है, छवियों को पृष्ठभूमि थ्रेड में लोड किया जाता है, जमे हुए और छवि के स्रोत पर सेट किया जाता है। जाहिर है, आपने इसमें बहुत कुछ सोचा है ... लेकिन, शायद आप जो कुछ हासिल करना चाहते हैं उसके बारे में अधिक जानना बेहतर होगा। उदाहरण के लिए, आपके पास ऐसी समस्याएं हैं जो ऐसी प्राथमिकता को अनुकूलित करने में सक्षम हैं? –
@PaulHoenecke हाय पॉल, आपके उत्तर के लिए धन्यवाद। जब आप बड़े संग्रह से छोटी संख्या में आइटम प्रदर्शित करना चाहते हैं तो आभासी संग्रह आपकी सहायता करते हैं। यहां, मैं समवर्ती रूप से लगभग 1 के आइटम प्रदर्शित करना चाहता हूं। इसके अतिरिक्त, मुझे यकीन नहीं है कि वर्चुअलाइजिंग ग्रिड मौजूद है। अंत में, पैटर्न 1 अनिवार्य रूप से वर्चुअलाइजिंग है - मैं एन संपादित कर दूंगा। – Avi
एवी, आपका प्रश्न वर्णित समस्या के लिए अनुचित दिखता है। आप कुछ कारणों से संपीड़न अनुपात में सुधार करना चाहते हैं, लेकिन फिर आपको यह जानना होगा कि आप किस प्रकार की छवियां प्रदर्शित कर रहे हैं। या, दूसरी ओर, आप उपयोगकर्ता को उपलब्ध सभी छवियों का एक प्रभाव देना चाहते हैं, तो आप कुछ सेट परिभाषित कर सकते हैं और थंबनेल प्रदर्शित कर सकते हैं या एक जैसे। लेकिन दोनों चीजों को एक दूसरे के साथ जरूरी नहीं है। हो सकता है कि आप समान छवियों को देखने के सेट को परिभाषित करने के लिए समानता मीट्रिक की तरह कुछ चाहते हों? –