तो मैं कुछ DirectX विकास कर रहा हूँ, शार्पएक्स का उपयोग कर .NET के तहत सटीक (लेकिन DirectX / C ++ API समाधान लागू होते हैं)। मैं डायरेक्टएक्स का उपयोग करके एक ऑर्थोगोनल प्रोजेक्शन (जैसे वैज्ञानिक ऐप के लिए 2 डी लाइन ड्राइंग का अनुकरण करना) में लाइनों को प्रस्तुत करने का सबसे तेज़ तरीका ढूंढ रहा हूं।
मेरे द्वारा रेंडर किए गए प्लॉटों के प्रकार का एक स्क्रीनशॉट इस प्रकार है:
इन प्रकार के भूखंडों के लिए यह असामान्य नहीं है कि लाखों सेगमेंट वाली लाइनें, वैरिएबल की मोटाई, प्रति-एंटीलिअसिंग प्रति-लाइन (या फुल स्क्रीन AA ऑन / ऑफ) के बिना हों। मुझे बहुत बार (जैसे 20 गुना / सेकंड) लाइनों के लिए कोने को अपडेट करने की आवश्यकता है और जितना संभव हो उतना GPU को ऑफलोड करना चाहिए।
अब तक मैंने कोशिश की है:
- सॉफ्टवेयर रेंडरिंग, उदाहरण के लिए GDI + वास्तव में खराब प्रदर्शन नहीं है, लेकिन स्पष्ट रूप से सीपीयू पर भारी है
- डायरेक्ट 2 डी एपीआई - जीडीआई की तुलना में धीमी, विशेष रूप से एंटीएलियासिंग पर
- Direct3D10 इस विधि का उपयोग करते हुए सीपीयू साइड पर वर्टेकल रंगों और टेसलेशन का उपयोग करके एए का अनुकरण करता है। धीमी गति से (मैंने इसे प्रोफाइल किया और 80% समय कंप्यूटिंग शीर्ष पदों पर बिताया है)
3 विधि के लिए मैं GPU के लिए एक त्रिकोण पट्टी भेजने के लिए वर्टेक्स बफ़र्स का उपयोग कर रहा हूं और हर 200ms को नए सिरे से अपडेट कर रहा हूं। मुझे 100,000 लाइन खंडों के लिए लगभग 5FPS की ताज़ा दर मिल रही है। मुझे लाखों आदर्श चाहिए!
अब मैं सोच रहा हूँ कि सबसे तेज़ तरीका GPU पर tessellation करना होगा, जैसे कि Geometry Shader में। मैं एक पंक्ति-सूची या बनावट में पैक के रूप में कोने भेज सकता हूं और क्वैड बनाने के लिए एक ज्यामिति शेडर में अनपैक कर सकता हूं। या, बस एक पिक्सेल shader में कच्चे अंक भेजें और Bresenham रेखा रेखा को पूरी तरह से पिक्सेल shader में लागू करें। मेरा एचएलएसएल 2006 से जंग खा रहा है, मॉडल 2 है तो मुझे पागल सामान के बारे में पता नहीं है जो आधुनिक जीपीयू कर सकता है।
तो सवाल यह है: - क्या किसी ने पहले भी ऐसा किया है, और क्या आपके पास कोशिश करने के लिए कोई सुझाव है? - क्या आपके पास तेजी से अपडेट होने वाली ज्योमेट्री (उदाहरण के लिए हर 20ms की नई सूची) के साथ प्रदर्शन को बेहतर बनाने के लिए कोई सुझाव है?
अद्यतन 21 जनवरी
मैंने लाइनस्ट्रिप और डायनेमिक वर्टेक्स बफ़र्स का उपयोग करके ज्यामिति शेड्स का उपयोग करके उपरोक्त विधि (3) को लागू किया है। अब मुझे 100k पॉइंट्स पर 100FPS और 1,000,000 पॉइंट्स पर 10FPS मिल रहे हैं। यह एक बहुत बड़ा सुधार है, लेकिन अब मैं फिल-दर और गणना सीमित कर रहा हूं, इसलिए मुझे अन्य तकनीकों / विचारों के बारे में सोचना पड़ा।
- एक लाइन सेगमेंट ज्यामिति के हार्डवेयर इंस्टेंसिंग के बारे में क्या?
- स्प्राइट बैच के बारे में क्या?
- अन्य (पिक्सेल shader) उन्मुख तरीकों के बारे में क्या?
- क्या मैं कुशलता से GPU या CPU पर कॉल कर सकता हूं?
आपकी टिप्पणियों और सुझावों की बहुत सराहना की!