मैं 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 डी प्रदर्शन में सुधार करने के लिए एमएसडीएन आलेख पढ़ा है और इसे ऑप्टिमाइज़ेशन के रूप में इसका कोई उल्लेख नहीं किया है।
किसी को भी कोई विचार है?
आपको केवल यह देखना चाहिए कि क्या देखना है। यदि आप पहले देखे गए ज्यामिति फ़िल्टर करते हैं और फिर केवल उन्हें प्रदर्शित करते हैं तो अपने कोड से पता नहीं लगा सकते हैं। – CodeAngry
डी 2 डी और जीडीआई + दोनों के लिए सब कुछ ध्यान में है और कोई और ऑप्टिमाइज़ेशन जो मैं कर सकता हूं वह डी 2 डी और जीडीआई + दोनों के लिए समान रूप से लागू किया जा सकता है ताकि यह समझाए कि डीडीडी प्रदर्शन जीडीआई + की तुलना में इतना खराब क्यों है। – Neutrino
मैं एक ही बिंदु पर हूं (मैं डायरेक्ट 2 डी के साथ प्रतिपादन के लिए समर्थन जोड़ रहा हूं) और मेरा मानना है कि ऑफस्क्रीन प्रतिपादन में मदद करनी चाहिए (मुझे लगता है कि उस विषय में इसका उल्लेख नहीं किया गया है क्योंकि वे स्थैतिक के बजाय गतिशील दृश्य मानते हैं)। क्या आपने इस मुद्दे को किसी भी तरह से हल करने में कामयाब रहे हैं? – Victoria