2009-04-30 15 views
7

के साथ प्रदर्शन प्रस्तुत करता है मैंने एक WPF नियंत्रण (फ्रेमवर्क एलिमेंट से विरासत) बनाया है जो एक टाइल किए गए ग्राफ़िक को प्रदर्शित करता है जिसे पैन किया जा सकता है। प्रत्येक टाइल 24bpp पर 256x256 पिक्सेल है। मैंने ऑनरेंडर को ओवरराइड कर दिया है। वहां, मैं किसी भी नई टाइल्स (बिटमैपफ्रेम के रूप में) लोड करता हूं, फिर DrawContext.DrawImage का उपयोग करके सभी दृश्यमान टाइल्स खींचता हूं।WPF बिटमैप स्रोत

अब, जब भी प्रति रेंडर चक्र के एक मुट्ठी भर नए टाइल से अधिक होते हैं, तो फ्रेमरेट लगभग एक सेकंड के लिए 60fps से शून्य तक गिर जाता है। यह छवियों को लोड करने के कारण नहीं होता है (जो मिलीसेकंड के क्रम में होता है), न ही DrawImage (जिसमें कोई समय नहीं लगता है, क्योंकि यह केवल कुछ इंटरमीडिएट डेटा संरचना प्रस्तुत करता है)।

मेरा अनुमान है कि जब भी यह बड़ी बिटमैप स्रोत उदाहरणों (यानी, जो पहले से ही कैश नहीं किया गया था) की बड़ी संख्या (~ 20) प्राप्त होती है तो रेंडर थ्रेड खुद को चोक करता है। या तो यह उन्हें कुछ आंतरिक डायरेक्टएक्स-संगत प्रारूप में परिवर्तित करने में बहुत समय व्यतीत करता है या यह एक कैशिंग समस्या हो सकती है। यह वीडियो रैम से बाहर नहीं हो सकता है; छिद्रक नीचे 60 एमबी पर चोटियों को दिखाता है, मेरे पास 256 एमबी है। इसके अलावा, छिद्रक कहते हैं कि सभी प्रस्तुत लक्ष्य हार्डवेयर-त्वरित होते हैं, इसलिए यह भी नहीं हो सकता है।

किसी भी अंतर्दृष्टि की सराहना की जाएगी!

अग्रिम

डैनियल

धन्यवाद

@RandomEngy:
BitmapScalingMode.LowQuality समस्या एक छोटे से कम है, लेकिन यह से छुटकारा पाने के नहीं किया। मैं पहले से ही संकल्प पर टाइल्स लोड कर रहा हूं। और यह ग्राफिक्स ड्राइवर नहीं हो सकता है, जो अद्यतित है (एनवीडिया)।
मुझे यह जानने में थोड़ा आश्चर्य हुआ कि स्केलिंग में इतना समय लगता है। जिस तरह से मैंने इसे समझा, बिटमैप (इसके आकार के बावजूद) को केवल डायरेक्ट 3 डी बनावट और फिर हार्डवेयर-स्केल के रूप में लोड किया गया है। तथ्य के रूप में, पहली बार बिटमैप को पहली बार प्रस्तुत किया गया है, मैं बिना किसी और फ्रीज के अपने घूर्णन और स्केल को बदल सकता हूं।

उत्तर

3

यह सिर्फ बड़ी संख्या में छवियों के साथ नहीं है। जब तक इसे लोड नहीं किया जाता है, तब तक केवल एक बड़ी छवि प्रतिपादन को पकड़ने के लिए पर्याप्त होती है, और जब आपकी छवि आयाम हजारों में उठने लगती है तो यह काफी उल्लेखनीय हो सकता है।

मैं आपसे सहमत हूं कि यह शायद धागा प्रस्तुत करता है: मैंने एक परीक्षण किया और यूआई थ्रेड अभी भी खुशी से संदेशों को प्रेषित कर रहा था, जबकि यह रेंडर देरी पूरी तरह से पूर्व-कैश बिटमैप छवि प्रदर्शित करने की कोशिश करने से हो रही थी।

यह छवि पर कुछ प्रकार के रूपांतरण या तैयारी कर रहा है, जैसा कि आप अनुमान लगा रहे थे। मैंने इसे अपने प्रतिपादन में "प्रतिपादन" करके कम करने की कोशिश की है, लेकिन छवि को छिपाने के बाद, इसे प्रकट करने के दौरान इसे प्रकट करना। हालांकि यह आदर्श से कम है क्योंकि प्रतिपादन फ्रीज वैसे भी होता है।

(संपादित करें)

कुछ फॉलोअप: एमएस WPF उर्फ ​​मैंने पाया क्या देरी पैदा कर रहा था पर एक चर्चा के बाद। मेरी सर्वर 2008 मशीन पर यह पुराने वीडियो ड्राइवरों का संयोजन था जो नए डब्लूडीडीएम ड्राइवर मॉडल और छवि का आकार बदलने में देरी का समर्थन नहीं करते हैं।

यदि स्रोत छवि का आकार प्रदर्शन आकार से अलग है, तो छवि दिखाए जाने से पहले रेंडर थ्रेड में देरी होगी। डिफ़ॉल्ट रूप से एक छवि उच्चतम गुणवत्ता पर सेट होती है, लेकिन आप RenderOptions.SetBitmapScalingMode(uiImage, BitmapScalingMode.LowQuality); पर कॉल करके प्रतिपादन के लिए स्केलिंग विकल्प बदल सकते हैं। एक बार ऐसा करने के बाद, एक छवि प्रदर्शित करने से पहले रहस्यमय फ्रीज चला गया। एक विकल्प, यदि आपको स्केलिंग में गुणवत्ता ड्रॉप पसंद नहीं है, तो बिटमैप इमेज को डीकोड पिक्सेलविड्थ/ऊंचाई के आकार के बराबर लोड करना होगा जिसे इसे प्रदर्शित किया जाएगा। फिर यदि आप पृष्ठभूमि थ्रेड पर बिटमैप छवि लोड करते हैं, तो आपको इसे प्रदर्शित करने में कोई देरी नहीं होनी चाहिए।

0

इन्हें भी आजमाएं;

/* ivis is declared in XAML <Image x:Name="iVis" UseLayoutRounding="True" SnapsToDevicePixels="True" /> */ 

iVis.Stretch = Stretch.None; 
RenderOptions.SetBitmapScalingMode(iVis, BitmapScalingMode.NearestNeighbor); 
RenderOptions.SetEdgeMode(iVis, EdgeMode.Aliased); 
VisualBitmapScalingMode = BitmapScalingMode.NearestNeighbor; 
iVis.Source = **** your bitmap source **** 

मैं जब 'ए' चैनल रंग के की एक बड़ी राशि का उपयोग कर, जब तक के बाद छवि को मापना यह मेरे लिए बहुत अच्छा काम किया गाया था इंतज़ार कर रहे प्रदर्शन के साथ कुछ परेशानी हो रही थी।

इसके अलावा, जैसा कि आपने एक टाइल ग्राफ़िक का उपयोग करके कहा था?

आमतौर पर आप अपने फ्रेमवर्क एलिमेंट पर ब्रश के रूप में सेट करने के लिए TileBrush का उपयोग करेंगे। यदि आप उन्हें एनिमेट कर रहे हैं या गतिशील रूप से नए जोड़ रहे हैं, तो आप अपने ब्रश उत्पन्न कर सकते हैं, फिर मैन्युअल रूप से जाने पर उन्हें अपने ऑब्जेक्ट पर लागू कर सकते हैं, यदि आप कर सकते हैं तो उन्हें फ्रीज करना सुनिश्चित करें। इसके अलावा, VisualBitmapScalingMode किसी भी दृश्य की एक संपत्ति है।

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