2012-11-28 20 views
9

मैं Win7 पर एक डॉटनेट 4.0 एप्लिकेशन विकसित कर रहा हूं जिसे मैपिंग करने की आवश्यकता है। मैपिंग एप्लिकेशन के रूप में यह उच्च रिज़ॉल्यूशन एंटीअलाइज्ड बहुभुज के बकवास भार को आउटपुट करता है। यह वर्तमान में दो प्रकार के प्रतिपादन आउटपुट, जीडीआई + और डायरेक्ट 2 डी का समर्थन करता है।मेरा डायरेक्ट 2 डी ड्राइंग प्रदर्शन इतना भयानक क्यों है?

मुझे चिंता है क्योंकि जीडीआई + आउटपुट डायरेक्ट 2 डी की तुलना में 3 तेज के कारक के आसपास है।

दोनों प्रस्तुतकर्ता एए का उपयोग कर रहे हैं। मुझे पता है कि मैं इसे डायरेक्ट 2 डी में बंद कर सकता हूं जो थ्रूपुट को कुछ हद तक सुधारता है (जीडीआई + से 2 खराब होने के कारक के बारे में)। लेकिन यह कोई समाधान नहीं है, क्योंकि मैं जीडीआई + में भी एए बंद कर सकता हूं और वहां भी बेहतर प्रदर्शन कर सकता हूं। इस बेंचमार्क के प्रयोजन के लिए मेरा प्रतिपादन कोड छोटा है। मुझे आशा है कि मैंने कुछ भयानक गलती की है कि कोई मुझे बता सकता है कि स्थिति का समाधान करेगा।

_renderTarget.BeginDraw(); 

// Paint background. 
RectF rf = new RectF(0.0f, 0.0f, renderTargetSize.Width, renderTargetSize.Height); 
_renderTarget.FillRectangle(rf, _backgroundBrush); 

// Draw polygons 
foreach (GisTypes.Polygon polygon in _polygons) 
{ 
    using (PathGeometry path = _factory.CreatePathGeometry()) 
    { 
     using (GeometrySink sink = path.Open()) 
     { 
      sink.SetFillMode(Microsoft.WindowsAPICodePack.DirectX.Direct2D1 
       .FillMode.Alternate); 

      Point2F[] points = Array.ConvertAll(polygon.Points, 
       x => new Point2F((float)x.X, (float)x.Y)); 

      sink.BeginFigure(points[0], FigureBegin.Filled); 

      for (int i = 1; i < points.Length; ++i) 
      { 
       sink.AddLine(points[i]); 
      } 

      sink.EndFigure(FigureEnd.Closed); 
      sink.Close(); 
     } 

     using (TransformedGeometry transformedPath = _factory.CreateTransformedGeometry(
      path, WorldToPage)) 
     { 
      _renderTarget.FillGeometry(transformedPath, _fillBrush); 
      _renderTarget.DrawGeometry(transformedPath, _borderBrush, 1.0f); 
     } 
    } 
} 

_renderTarget.EndDraw(); 

इस नमूना कोड में मैं एक पथ और प्रति पॉलीगोन प्रति एक आंकड़ा का उपयोग कर रहा हूं। इसका कारण यह है कि यह जीडीआई + कार्यान्वयन और नमूना कोड के बजाय वास्तविक अनुप्रयोग में अधिक बारीकी से दर्पण करता है, यह चयनित पॉलीनों के प्रतिपादन को सरल बनाता है। मुझे पता है कि मैं एक ही पथ और एकाधिक आंकड़ों का उपयोग कर सकता हूं, और मैंने इसे इस तरह से आजमाया है, यह मामूली तेजी से है लेकिन सामान्य मुद्दे पर असर डालने के लिए पर्याप्त नहीं है।

मैं RenderTarget पर ट्रांसफॉर्म को सेट करने के बजाय ट्रांसफॉर्मेड जीमेट्री का भी उपयोग कर रहा हूं। इसका कारण यह है कि हालांकि मैं ज्यामिति को बदलना चाहता हूं, मैं नहीं चाहता कि रूपरेखा बदल गई क्योंकि स्केलिंग कारक इसे पूरी तरह से गायब कर देगा।

विशेष नमूना डेटा में मैं उपयोग कर रहा हूं केवल कुछ सौ बहुभुज हैं, लेकिन प्रत्येक बहुभुज में कई हज़ार अंक हो सकते हैं, इसलिए मुझे नहीं लगता कि प्रतिपादन के दौरान एकाधिक पथजीमेट्री और ट्रांसफॉर्मेड जीमेट्री का आवंटन समस्या है , (चूंकि उनमें से कई नहीं हैं, और मैंने पहले ही एक पथजीमेट्री और ट्रांसफॉर्मेड जीमेट्री का उपयोग करके इसे आजमाया है और अंतर मामूली था)।

मुझे आश्चर्य हुआ कि मुझे ऑफस्क्रीन रेंडरटाइटल पर प्रतिपादन नहीं करना चाहिए और परिणाम को ऑनस्क्रीन रेंडरटाइटल पर क्लिक करना चाहिए, लेकिन मैंने डायरेक्ट 2 डी प्रदर्शन में सुधार करने के लिए एमएसडीएन आलेख पढ़ा है और इसे ऑप्टिमाइज़ेशन के रूप में इसका कोई उल्लेख नहीं किया है।

किसी को भी कोई विचार है?

+0

आपको केवल यह देखना चाहिए कि क्या देखना है। यदि आप पहले देखे गए ज्यामिति फ़िल्टर करते हैं और फिर केवल उन्हें प्रदर्शित करते हैं तो अपने कोड से पता नहीं लगा सकते हैं। – CodeAngry

+1

डी 2 डी और जीडीआई + दोनों के लिए सब कुछ ध्यान में है और कोई और ऑप्टिमाइज़ेशन जो मैं कर सकता हूं वह डी 2 डी और जीडीआई + दोनों के लिए समान रूप से लागू किया जा सकता है ताकि यह समझाए कि डीडीडी प्रदर्शन जीडीआई + की तुलना में इतना खराब क्यों है। – Neutrino

+0

मैं एक ही बिंदु पर हूं (मैं डायरेक्ट 2 डी के साथ प्रतिपादन के लिए समर्थन जोड़ रहा हूं) और मेरा मानना ​​है कि ऑफस्क्रीन प्रतिपादन में मदद करनी चाहिए (मुझे लगता है कि उस विषय में इसका उल्लेख नहीं किया गया है क्योंकि वे स्थैतिक के बजाय गतिशील दृश्य मानते हैं)। क्या आपने इस मुद्दे को किसी भी तरह से हल करने में कामयाब रहे हैं? – Victoria

उत्तर

2

मुझे विश्वास है कि आपकी ड्राइंग रूटीन अक्सर संसाधन बना रही है, जो वास्तव में समय लेने वाली है। ज्यामिति और सिंक device-independent resources होने पर, उन्हें तब तक बना और बनाए रखना चाहिए जब तक वे संशोधित नहीं होते हैं। वे संशोधन आमतौर पर तब होते हैं जब आप ... बदलते हैं, निश्चित रूप से, और जब आप विंडो को स्थानांतरित/आकार बदलते हैं या सामग्री को पैन/ज़ूम करते हैं। आपकी ड्राइंग रूटीन केवल पहले ही संसाधनों को खींचती है और तेज़ी से होनी चाहिए।

उम्मीद है कि इससे मदद मिलती है।

+0

इसके लिए धन्यवाद, लेकिन आप जो सुझाव देते हैं वह वह है जो मैं पहले से कर रहा हूं।उपरोक्त दिनचर्या WM_PAINT के डब्ल्यूपीएफ समकक्ष में बुलाया जा रहा है और जैसे ही दृश्य को पॅन किया गया है या ज़ूम किया गया है, और डेटा प्रदान किया जा रहा है केवल देखने योग्य क्षेत्र के भीतर है। हालांकि यह सच है कि मैं कम आकर्षित करना चाहता था, यह तेजी से प्रस्तुत करेगा, लेकिन समान रूप से यदि मैं जीडीआई के साथ कम आकर्षित करता हूं जो भी तेज़ी से प्रस्तुत करेगा, तो डी 2 डी प्रदर्शन में सुधार करने के लिए कम प्रतिपादन डी 2 डी के खराब प्रदर्शन की व्याख्या नहीं करता है जीडीआई के सापेक्ष। – Neutrino

+0

ठीक है, मुझे नहीं पता था कि आप WPF का उपयोग कर रहे थे। मुझे लगता है कि आपने यह देखने के लिए पहले से ही अपना दिनचर्या प्रोफाइल किया है कि कौन सा विशेष निर्देश इतना समय लेता है, इसलिए मुझे कोई अन्य विचार नहीं है, क्षमा करें। – Papaya

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