2012-04-23 18 views
8

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

अनुसंधान के एक बिट करने के बाद ऐसा लगता है दो दृष्टिकोण हैं:

  • एक GDI + मार्ग जहां ग्राफिक्स एक WriteableBitmap या InteropBitmap लिए तैयार हैं।
  • SlimDX या DirectX संस्करण (एक D3DImage में होस्ट)


इन दो बेहद अलग दृष्टिकोण जो मार्ग सबसे अच्छा होगा पर विचार लेने के लिए दिया गया है:

  • ग्राफ के साथ बातचीत में तेजी से भी होना चाहिए पूरे ग्राफ को देखते हुए।
  • दृश्यों को अद्यतन करना तेज होना चाहिए (रंग या आकार परिवर्तन)
  • हिट परीक्षण तेज (बिंदु और आयताकार) होना चाहिए।
  • विकास समय पर पूरा किया जाना चाहिए।

आप किस विधि का उपयोग करेंगे और क्यों?

संपादित करें:
ऐसा लगता है कि similar question से पूछा गया था लेकिन उत्तर नहीं दिया गया था।

+0

जीडीआई + धीमी। जीडीआई तेजी से लेकिन बदसूरत। डी 2 डी बेहतर है लेकिन धीमा है। स्लिम डीएक्स एक बड़ी निर्भरता और बड़े अमूर्त सीखने की वक्र है। तीसरा विकल्प, डीएक्स 9 या (डीएक्सजीआई के माध्यम से डीएक्स 11) का उपयोग करके, क्योंकि यह डब्ल्यूपीएफ डी 3DImage इंटरफ़ेस के साथ हिलाता है। एक सीखने की अवस्था को मंजूरी दी, लेकिन एक 3 डीएक्स डिवाइस, संदर्भ, बफर, शेडर बनाने और डायरेक्ट 3 डी के माध्यम से अपना ऐप प्रतिपादन प्राप्त करने के लिए अधिक रखरखाव योग्य। दस्तावेज भयानक है और इसमें कुछ शोध और परीक्षण त्रुटि होगी लेकिन ऐसा लगता है कि यह उतना बुरा नहीं है जितना लगता है। असली दुनिया के लिए यहां देखें [18 मेग डेमो डाउनलोड] (http://www.gigasoft.com) में डब्ल्यूपीएफ विनफॉर्म और एमएफसी, और इसका ज्यादातर डब्ल्यूएवी और जीआईएस डेटा शामिल है। – Robert

उत्तर

1

मुझे प्रत्येक दृष्टिकोण के पेशेवरों और विपक्ष की कोशिश करने और सूचीबद्ध करने दें - जो शायद आपको इसका उपयोग करने के बारे में कुछ विचार देगा।

GDI पेशेवरों

  • आसान
  • कोई ज़रूरत नहीं के साथ वेक्टर आकार आकर्षित करने के लिए अतिरिक्त पुस्तकालयों
  • शामिल करने के लिए

GDI विपक्ष

    DX
  • से सीमित करने के लिए की आवश्यकता है
  • धीमी "फैंसी" ड्राइंग (ग्रेडियेंट्स और पसंद) या यह एम ight चीजों को नीचे
  • धीमी आरेख इंटरैक्टिव होने की जरूरत है, तो - एक बढ़िया विकल्प नहीं हो सकता है

SlimDX पेशेवरों

  • कुछ फैंसी ड्राइंग कर सकते हैं, जबकि तेजी से GDI से
  • तो किया जा रहा है ड्राइंग इंटरैक्टिव है - यह दृष्टिकोण बहुत बेहतर होगा
  • चूंकि आप प्राइमेटिव आकर्षित करते हैं, आप प्रत्येक ज़ूम स्तर
पर गुणवत्ता को नियंत्रित कर सकते हैं

SlimDX विपक्ष

  • नहीं बहुत से सरल आकार आकर्षित करने के लिए आसान है - आप अपने कपोल-कल्पना लिख ​​सकते हैं या एक पुस्तकालय में मदद करता है कि आप आकार
  • के रूप में एक GDI उपयोग करने के लिए विशेष रूप से अगर सरल नहीं आकर्षित का उपयोग करना होगा आपने इसे

और शायद मैं यहां डालना भूल गया था, लेकिन शायद ये शुरुआत करने वालों के लिए करेंगे?

-A।

+0

आपकी प्रतिक्रिया के लिए धन्यवाद! क्या आपके पास स्लिम डीएक्स (डब्ल्यूपीएफ एकीकरण) का उपयोग कर कोई अनुभव है? क्या यह प्रस्तुत करने वाली चीजों की मात्रा के लिए ऊपरी सीमा है? मैं स्लिम डीएक्स के सीखने वक्र का वजन करने की कोशिश कर रहा हूं जो प्रदर्शन लाभों के साथ जीडीआई मार्ग बनाम प्रदान करता है। – CBent

+0

मेरा मानना ​​है कि स्लिम डीएक्स में एक डब्ल्यूपीएफ इंटरऑपरेबिलिटी नमूना है (http://code.google.com/p/slimdx/source/browse/trunk/samples/Direct3D10/WpfSample10/)। साथ ही, स्लिम डीएक्स/डायरेक्टएक्स क्या प्रस्तुत कर सकता है, इसके लिए कोई ऊपरी सीमा नहीं है, याद रखें कि प्रदर्शन केवल ग्राफिक्स कार्ड अश्वशक्ति का एक कार्य है और आपकी प्रतिपादन क्षमता - वास्तव में यह जीडीआई और डीएक्स दोनों के लिए सच है। मैं पहले जीडीआई मार्ग को नीचे जाने की सिफारिश करता हूं और स्लिम डीएक्स सहारा लेता हूं यदि प्रदर्शन आपकी आवश्यकताओं से मेल नहीं खाता है। – Ani

+0

मुझे उत्सुकता है कि आप स्लिम डीएक्स पर चीजों को करने के "जीडीआई" तरीके की सिफारिश क्यों करते हैं। क्या स्लिम डीएक्स का सीखना वक्र उच्च है?एक चिंता है कि जीडीआई मार्ग (प्रतिपादन, तेजी से स्थानिक चयन, और एकीकरण) को लागू करने के लिए यह पता लगाने के लिए कि यह बहुत धीमा है, पहली बार GPU त्वरित मार्ग के साथ जाने पर समस्या का "अपशिष्ट" होगा । फिर, जवाब देने के लिए धन्यवाद। – CBent

7

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

हालात के लिए बाहर देखने के लिए (और इन भी अन्य ग्राफिक्स इंजन के लिए लागू करने के लिए पर्याप्त रूप से सामान्य कर रहे हैं,):

सभी की
  1. पहले: उपाय। अपने कोड में वास्तविक बाधा क्या है यह देखने के लिए एक प्रोफाइलर का उपयोग करें।
  2. पुन: उपयोग जीडीआई प्राइमेटिव। यह महत्वपूर्ण है। यदि आपको समान या समान दिखने वाले 100,000 ग्राफिक्स ऑब्जेक्ट्स को आकर्षित करना है, तो उसी Pen, Brush आदि का उपयोग करें। इन प्राइमेटिव्स को बनाना महंगा है।
  3. प्रतिपादन डेटा कैश करें - उदाहरण के लिए: यदि आपको आवश्यकता नहीं है तो gfx तत्व स्थिति को पुन: गणना न करें।
  4. पैनिंग/ज़ूमिंग करते समय, कम जीडीआई + गुणवत्ता (और महंगा जीडीआई संचालन के बिना) के साथ दृश्य खींचें। गुणवत्ता को कम करने के लिए Graphics ऑब्जेक्ट सेटिंग्स हैं। उपयोगकर्ता पैनिंग बंद करने के बाद, उच्च गुणवत्ता वाले दृश्य को खींचें।
  5. प्रदर्शन में सुधार करने वाली बहुत सी चीजें और बहुत सी चीजें। मैं इस ऐप को 2-3 साल के लिए विकसित कर रहा हूं (या यह 4 पहले से ही हैम?) अब और मुझे अभी भी चीजों को बेहतर बनाने के तरीके मिलते हैं :)। यही कारण है कि प्रोफाइलिंग महत्वपूर्ण है - कोड बदलता है और यह प्रदर्शन को प्रभावित कर सकता है, इसलिए आपको नया कोड प्रोफाइल करने की आवश्यकता है।

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

+0

प्रोजेक्ट लीडर जीडीआई +/बिटमैप रूट जाने से सावधान है क्योंकि उसके पिछले अनुभव धीमे होने के कारण (वह सही या गलत हो सकता है)। वह एक प्रदर्शन आधारित समाधान चाहता है और उसके सिर में फंस गया है कि डायरेक्टएक्स समाधान है। क्या आपको लगता है कि जीडीआई + 30 एफपीएस के लिए पर्याप्त तेज़ होगा और 100k ऑब्जेक्ट्स के साथ इंटरैक्टिव होगा? – CBent

+0

@CBent: कहना मुश्किल है, यह आपके द्वारा चित्रित की जाने वाली प्रकृति (और हार्डवेयर, स्पष्ट रूप से) की प्रकृति पर निर्भर करता है। लेकिन यहां कुछ ऐसा है जो मैंने खुद पर ठोकर खाया और निश्चित रूप से अपने आवेदन के लिए प्रयोग करेगा: http://code.google.com/p/sharpdx/। दावा सबसे तेज़ प्रबंधित डायरेक्टएक्स लाइब्रेरी होने का दावा करता है - यदि यह WindowsAPICodePack से तेज़ है, तो यह वास्तव में वास्तविक तेज़ है! –

+0

@CBent: और ओह हाँ, डायरेक्टएक्स आमतौर पर जाने का तरीका होता है जब आपको तेज़ ग्राफिक्स की आवश्यकता होती है, इसलिए मुझे लगता है कि आपके प्रोजेक्ट लीडर की सोच सही है। मैं जीडीआई + मार्ग के साथ गया क्योंकि यह मोनो पोर्टेबल था - मेरे पास उपयोगकर्ता लिनक्स और मैक पर अपना ऐप चला रहे हैं। –

3

मैंने हाल ही में डायरेक्टएक्स पर कुछ ड्राइंग कोड पोर्ट किया है और परिणाम से बहुत खुश हैं। हम मुख्य रूप से बिट-बैशिंग का उपयोग करके बिटमैप्स प्रस्तुत कर रहे थे और रेंडर समय देख रहे थे जिन्हें मिनटों में लगभग 1-2 सेकंड तक मापा जा सकता था।

यह सीधे आपके उपयोग की तुलना नहीं किया जा सकता है, क्योंकि हम सी ++ में सीडी में डायरेक्ट 3 डी में स्लिम डीएक्स का उपयोग करके बिट-बैशिंग से चले गए हैं, लेकिन मुझे लगता है कि आप प्रदर्शन लाभ देखेंगे, भले ही वे ऑर्डर न हों परिमाण का हम देख रहे हैं।

मैं आपको स्लिम डीएक्स के साथ डायरेक्ट 2 डी का उपयोग करने की सलाह दूंगा। आपको DirectX 10.1 का उपयोग करने की आवश्यकता होगी क्योंकि Direct2D किसी कारण से DirectX 11 के साथ संगत नहीं है। यदि आपने डब्ल्यूपीएफ में ड्राइंग एपीआई का उपयोग किया है तो आप डायरेक्ट 2 डी से पहले ही परिचित होंगे क्योंकि इसकी एपीआई डब्ल्यूपीएफ ड्राइंग एपीआई पर आधारित है, जहां तक ​​मैं कह सकता हूं। डायरेक्ट 2 डी के साथ मुख्य समस्या दस्तावेज की कमी है और तथ्य यह है कि यह केवल Vista में काम करता है।

मैं DirectX 10/WPF इंटरॉप के साथ प्रयोग नहीं किया है, लेकिन मेरा मानना ​​है कि यह संभव (http://stackoverflow.com/questions/1252780/d3dimage-using-dx10)

संपादित है: मैंने सोचा कि मैं आपको एक साधारण बहुभुज ड्राइंग के हमारे कोड से तुलना प्रदान करते हैं। सबसे पहले WPF संस्करण:

 StreamGeometry geometry = new StreamGeometry(); 

     using (StreamGeometryContext ctx = geometry.Open()) 
     { 
      foreach (Polygon polygon in mask.Polygons) 
      { 
       bool first = true; 

       foreach (Vector2 p in polygon.Points) 
       { 
        Point point = new Point(p.X, p.Y); 

        if (first) 
        { 
         ctx.BeginFigure(point, true, true); 
         first = false; 
        } 
        else 
        { 
         ctx.LineTo(point, false, false); 
        } 
       } 
      } 
     } 

अब Direct2D संस्करण:

 Texture2D maskTexture = helper.CreateRenderTexture(width, height); 

     RenderTargetProperties props = new RenderTargetProperties 
     { 
      HorizontalDpi = 96, 
      PixelFormat = new PixelFormat(SlimDX.DXGI.Format.Unknown, AlphaMode.Premultiplied), 
      Type = RenderTargetType.Default, 
      Usage = RenderTargetUsage.None, 
      VerticalDpi = 96, 
     }; 

     using (SlimDX.Direct2D.Factory factory = new SlimDX.Direct2D.Factory()) 
     using (SlimDX.DXGI.Surface surface = maskTexture.AsSurface()) 
     using (RenderTarget target = RenderTarget.FromDXGI(factory, surface, props)) 
     using (SlimDX.Direct2D.Brush brush = new SolidColorBrush(target, new SlimDX.Color4(System.Drawing.Color.Red))) 
     using (PathGeometry geometry = new PathGeometry(factory)) 
     using (SimplifiedGeometrySink sink = geometry.Open()) 
     { 
      foreach (Polygon polygon in mask.Polygons) 
      { 
       PointF[] points = new PointF[polygon.Points.Count()]; 
       int i = 0; 

       foreach (Vector2 p in polygon.Points) 
       { 
        points[i++] = new PointF(p.X * width, p.Y * height); 
       } 

       sink.BeginFigure(points[0], FigureBegin.Filled); 
       sink.AddLines(points); 
       sink.EndFigure(FigureEnd.Closed); 
      } 

      sink.Close(); 
      target.BeginDraw(); 
      target.FillGeometry(geometry, brush); 
      target.EndDraw(); 
     } 

आप देख सकते हैं, Direct2D संस्करण से थोड़ा अधिक काम है (और कुछ सहायक कार्यों मैं लिखा है पर निर्भर करता है), लेकिन यह वास्तव में बहुत समान है।

+0

मुझे आशा है कि डायरेक्टएक्स संस्करण (वर्तमान में शार्पडीएक्स को देखकर) पर जाकर हमारे एप्लिकेशन की प्रतिपादन आपके जितनी अधिक सुधार करेगी। हम सरल रेखाएं और 2 डी बहुभुज चित्रित कर रहे हैं (लेकिन उनमें से बहुत से डब्ल्यूपीएफ चकमा शुरू करते हैं)। SlimDX शोध के लिए आपने किन संसाधनों का उपयोग किया था? – CBent

+0

मुझे डर है कि यह एक साल या उससे पहले किया गया था, इसलिए मुझे उपयोग किए गए सटीक संसाधनों को याद नहीं किया जा सकता है। स्लिम डीएक्स डायरेक्ट 2 डी कॉम एपीआई के बहुत करीब से चिपक जाता है, इसलिए सी ++ में किसी भी उदाहरण को सी #/स्लिम डीएक्स में आसानी से परिवर्तित किया जा सकता है, जो मुझे विश्वास है कि मैंने किया था। – Grokys

+0

वाह! मुझे बस आपके संपादित पोस्ट को शामिल कोड के साथ मिला है। वे वास्तव में बहुत समान हैं। क्या आपको स्लिमडैक्स के लिए संगत बनाने के लिए अपने किसी भी बहुभुज प्रारूप को बदलना पड़ा? क्या आपका एप्लिकेशन एक पूर्ण स्क्रीन एप्लिकेशन, एक एकल डीएक्स सतह है, या क्या आपके पास कई बार एक ही बार दिखाया गया है? – CBent

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