2012-04-03 19 views
11

मुझे [कैनवास] [2] के बच्चों के रूप में बहुत सारे Shape (लगभग 1/2 सौ हजार) आकर्षित करना है। मैं इसे दो भागों में अपने डब्ल्यूपीएफ एप्लिकेशन को विभाजित करने में काम करता हूं: पहली बात यह है कि मैं उनमें से प्रत्येक के गुणों को सेट करके आकार बना देता हूं (जैसे मार्जिन, फिल, चौड़ाई, आदि ...), जब मैं कैनवास के बच्चों के रूप में आकार जोड़ता हूं।कैनवास प्रतिपादन प्रदर्शन में सुधार कैसे करें?

MyCanvas.Children.Add(MyShape) 

अब मैं दूसरे भाग के प्रदर्शन में सुधार करना चाहते हैं, क्योंकि जब मैं आकार आकर्षित अपने आवेदन समय की एक लंबी अवधि के लिए अवरुद्ध है। इसलिए मैंने Dispatcher और इसकी विधि [BeginInvoke] [4] को विभिन्न [प्राथमिकताओं] [5] के साथ उपयोग करने का प्रयास किया: केवल अगर मैं पृष्ठभूमि प्राथमिकता का उपयोग करता हूं तो मुख्य अनुप्रयोग ब्लॉक नहीं होता है, अन्यथा एप्लिकेशन अवरुद्ध रहता है और "चित्र" तब तक प्रदर्शित नहीं होता जब तक कि सभी आकार मेरे कैनवास में जोड़े नहीं जाते हैं, लेकिन यदि मैं पृष्ठभूमि प्राथमिकता का उपयोग करता हूं तो स्पष्ट रूप से सब कुछ धीमा है। मैंने डिस्पैचर का उपयोग करने के बजाय एक नया धागा बनाने की भी कोशिश की, लेकिन इसमें कोई महत्वपूर्ण बदलाव नहीं आया।

मैं इस समस्या को कैसे ठीक कर सकता हूं, और जब मैं अपना आकार कैनवास में जोड़ता हूं तो आम तौर पर मेरे एप्लिकेशन के प्रदर्शन में सुधार कर सकता हूं?

धन्यवाद।

+0

क्या आपने DrawingVisual की कोशिश की है? –

+0

नहीं। क्या आप मुझे एलीपसे या पथ जैसे आकार के बजाय DrawingVisual का उपयोग करने का उदाहरण दे सकते हैं। उदाहरण के लिए, मैं अपने कैनवास में कैसे जोड़ सकता हूं [यह] (http://msdn.microsoft.com/en-us/library/ms745546.aspx) DrawingVisual का उपयोग करके पथ? – gliderkite

+0

हां, Google पर कुछ अच्छी जानकारी है। शुरू करने के लिए यहां एक लिंक दिया गया है: http://msdn.microsoft.com/en-us/magazine/dd483292.aspx –

उत्तर

7

Shape के बजाय Visual ऑब्जेक्ट्स का उपयोग करने की आवश्यकता है; विशेष रूप से, जैसा कि सुझाव दिया गया है, DrawingVisual: एक विज़ुअल ऑब्जेक्ट जिसका उपयोग वेक्टर ग्राफिक्स को प्रस्तुत करने के लिए किया जा सकता है। वास्तव में, जैसा कि एमएसडीएन पुस्तकालय में लिखा गया है:

ड्राइंग विज़ुअल एक हल्के ड्राइंग क्लास है जिसका उपयोग आकार, छवियों या पाठ को प्रस्तुत करने के लिए किया जाता है। इस वर्ग को हल्के वजन माना जाता है क्योंकि यह लेआउट, इनपुट, फोकस, या इवेंट हैंडलिंग प्रदान नहीं करता है, जो इसके प्रदर्शन में सुधार करता है। इस कारण से, चित्र पृष्ठभूमि और क्लिप कला के लिए आदर्श हैं।

तो, उदाहरण के लिए, एक DrawingVisual कि एक आयत में शामिल है बनाने के लिए:

private DrawingVisual CreateDrawingVisualRectangle() 
{ 
    DrawingVisual drawingVisual = new DrawingVisual(); 

    // Retrieve the DrawingContext in order to create new drawing content. 
    DrawingContext drawingContext = drawingVisual.RenderOpen(); 

    // Create a rectangle and draw it in the DrawingContext. 
    Rect rect = new Rect(new System.Windows.Point(160, 100), new System.Windows.Size(320, 80)); 
    drawingContext.DrawRectangle(System.Windows.Media.Brushes.LightBlue, (System.Windows.Media.Pen)null, rect); 

    // Persist the drawing content. 
    drawingContext.Close(); 

    return drawingVisual; 
} 

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

public class MyVisualHost : FrameworkElement 
{ 
    // Create a collection of child visual objects. 
    private VisualCollection _children; 

    public MyVisualHost() 
    { 
     _children = new VisualCollection(this); 
     _children.Add(CreateDrawingVisualRectangle()); 

     // Add the event handler for MouseLeftButtonUp. 
     this.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(MyVisualHost_MouseLeftButtonUp); 
    } 
} 

घटना से निपटने दिनचर्या तो HitTest विधि लागू ने टक्कर मार दी परीक्षण लागू कर सकते हैं। विधि का HitTestResultCallback पैरामीटर उपयोगकर्ता द्वारा परिभाषित प्रक्रिया को संदर्भित करता है जिसका उपयोग आप हिट टेस्ट की परिणामी कार्रवाई को निर्धारित करने के लिए कर सकते हैं।

+3

यह मदद करेगा, मामूली रूप से, हालांकि WPF किसी भी प्रकार के 50,000 दृश्यों को संभालने के लिए तैयार नहीं है। –

+0

तो सौ हजार वेक्टर ग्राफिक्स तत्वों को संभालने के लिए क्या तैयार है? – gliderkite

+0

क्यू और एआई से जुड़े हुए देखें: http://stackoverflow.com/questions/8713864/high-performance-graphics-using-the-wpf-visual-layer/8714107#8714107 –

1

यह UIElements के बहुत और शायद आप जिस प्रकार के प्रदर्शन की तलाश में हैं, वह नहीं दे रहे हैं। क्या आपको प्रतिपादित करने वाले प्रत्येक तत्व से बातचीत करने में सक्षम होना चाहिए? यदि नहीं, तो मैं इसके बजाय WriteableBitmap का उपयोग करने की अत्यधिक अनुशंसा करता हूं। यदि आपको आकृतियों को आकर्षित करने की आवश्यकता है और आप खुद को वह तर्क बनाना नहीं चाहते हैं (जो चाहते हैं?), check out the WriteableBitmapEx project over on CodePlex

+0

मुझे सभी आकारों के साथ बातचीत करने की ज़रूरत है, मैं भी आकार का उपयोग करता हूं क्योंकि "चित्र" एक वेक्टर ग्राफिक्स छवि है (छवि को स्केल किया जा सकता है - ज़ूम के साथ - गुणवत्ता को कम किए बिना किसी भी राशि से)। WritableBitmapEx के साथ मैं वही काम कर सकता था? – gliderkite

+1

मैं आकार का उपयोग नहीं करता, मैं DrawingVisual का उपयोग करता हूं। क्या आप इन विवरणों को अपने प्रश्न में जोड़ सकते हैं? मैं इसके बारे में सोचूंगा और अपना जवाब संशोधित करूंगा। –

3

सहमत हैं कि यदि आप लाखों तत्वों को आकर्षित करना चाहते हैं, तो आप इसे WPF में नहीं कर सकते हैं। जैसा कि उल्लेख किया गया है लिखने योग्य बिटमैपएक्स एक अच्छा विकल्प है।

this related question देखें जो डब्ल्यूपीएफ में उच्च प्रदर्शन ग्राफिक्स और उपलब्ध विकल्पों पर गहराई में जाता है।

यदि आपको बस कैनवास का उपयोग करना होगा, तो यह ZoomableApplication2 - A million items देखें। यह एक कैनवास आधारित डेमो है जो कैनवास पर 1,000,000 UIElements के साथ उचित प्रदर्शन प्राप्त करने के लिए वर्चुअलाइजेशन का भारी उपयोग करता है।

+0

यह संभव है क्योंकि मुझे लगभग 1/2 सौ हजार तत्वों को आकर्षित करना है (जैसा कि मैंने लिखा है) और मैंने अपने उत्तर का उपयोग करके किया है (प्रश्न पूछने के बाद से काफी समय हो गया है), वैसे भी आपके उत्तर के लिए धन्यवाद, लेकिन बिटमैप एक वेक्टर ग्राफिक्स नहीं है। – gliderkite

1

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

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

+0

इसके लिए धन्यवाद, मुझे ग्रिड पर बड़ी संख्या में लाइनों को चित्रित करने में प्रदर्शन समस्याएं थीं, और मेरी ड्रॉप छाया प्रभाव को हटाकर कोई नहीं है बिल्कुल अंतराल! – Cyral

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