2011-06-14 27 views
12

msdn documentation की विपक्ष बनाने बताते हैं कि DirectX 11 में वहाँ एक DirectX 11 बनावट प्रोग्राम के रूप में भरने के लिए कई तरीके हैं:प्रोग्राम DirectX 11 बनावट, पेशेवरों और तीन अलग अलग तरीकों

(1) डिफ़ॉल्ट उपयोग बनावट के साथ बनावट बनाएं और इसे मेमोरी

(2) गतिशील उपयोग के साथ बनावट बनाएं, मेमोरी बनावट के लिए पॉइंटर प्राप्त करने के लिए डिवाइसकॉन्टेक्स्ट मानचित्र का उपयोग करें, इसे लिखें, फिर इंगित करने के लिए अनमैप का उपयोग करें (जिस बिंदु पर मुझे लगता है यह जीपीयू में कॉपी किया गया है)

(3) स्टैगिन के साथ बनावट बनाएं जी उपयोग और डायनामिक बनावट के लिए एक ही कदम का पालन करें, लेकिन इस स्टेजिंग बनावट का उपयोग करने के लिए ID3D11DeviceContext.CopyResource पर कॉल के साथ उसका पालन करें (बदले में) डिफ़ॉल्ट या गतिशील बनावट को भरें।

हालांकि दस्तावेज प्रत्येक विधि के पेशेवरों और विपक्ष को समझाता नहीं है, और मैं अभी भी डायरेक्टएक्स के लिए काफी नया हूं, इसलिए यह मेरे लिए बिल्कुल स्पष्ट नहीं है।

डायरेक्टएक्स 11 में प्रोग्रामेटिक रूप से बनावट बनाने के इन तरीकों के पेशेवरों और विपक्ष क्या हैं?

साइड नोट: मैंने पढ़ा है कि मंचन बनावट के संदर्भ में पढ़ने GPU से वापस ताकि आप अपने डबल बफरिंग क्या करना है बफ़र नहीं है। लेकिन मुझे नहीं पता कि यह सटीक था और क्या यह स्टेजिंग बनावट (या वास्तव में इसका अर्थ है) का उपयोग करके लिखित पर लागू होता है।

द्वितीय पक्ष नोट: नक्शा विधि प्रलेखन का कहना है कि यह एक उप-संसाधन में डेटा के लिए एक सूचक प्राप्त करता है और उस सबसोर्स को GPU पहुंच से इनकार करता है। जब जीपीयू एक बनावट का उपयोग करना चाहता है जिसका अंतर्निहित डेटा मानचित्र द्वारा बुलाया गया है, तो यह क्या करता है? रोकने? (मैं पूछता हूं क्योंकि यह उन पेशेवरों और विपक्षों के हिस्से की तरह लगता है जिनके बारे में मैंने पूछा)

+0

नोट्स जोड़ना जैसे मैं सीखता हूं। स्पष्ट रूप से आप उपरोक्त विधि (1) का उपयोग करके प्रोग्रामिंग रूप से एक बहुआयामी डिफ़ॉल्ट बनावट नहीं बना सकते हैं। –

+0

डायरेक्टएक्स 11 में मैप करने के लिए कॉल में डी 3 डी 11_MAP_FLAG बेहद अस्पष्ट होने पर स्पष्ट रूप से GPU को बताता है कि मैप किए गए संसाधन की आवश्यकता होने पर क्या करना है। वर्तमान में केवल एक ध्वज दस्तावेज किया गया है, और यह स्पष्ट नहीं है कि 0 का उपयोग करना बंद करना है या नहीं। –

+2

स्पष्ट रूप से एक D3D11_USAGE_DYNAMIC संसाधन में 1 के बराबर miplevels होना चाहिए। –

उत्तर

17

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

तो यह सोचते हैं आप आवेदन स्मृति में डेटा आप बनावट में प्राप्त करना चाहते हैं कि क्या ज़रूरत है: यह सिर्फ एक स्थिर बनावट है (कि द्वारा मेरा मतलब है बनावट और अधिक की तुलना में यह करने के लिए लिखा है से पढ़ी जाती

), तो आप एक USAGE_DEFAULT या USAGE_IMMUTABLE बनावट चाहते हैं। इन्हें आम तौर पर USAGE_DYNAMIC की तुलना में जीपीयू पढ़ने के प्रदर्शन के लिए अनुकूलित किया जाता है। यदि आपके पास बनावट बनाते समय डेटा आसान होता है, तो विकल्प (1) सबसे आसान है, कम से कम इंटरमीडिएट मेमोरी का उपयोग करता है, और डीएक्स 11 में जीपीयू में डेटा ट्रांसफर आपके प्रतिपादन थ्रेड से अलग थ्रेड पर किया जा सकता है। यदि आपके पास बनावट बनाते समय डेटा नहीं है, तो आपके पास डेटा प्रदान करने के लिए UpdateSubresource() या विकल्प (3) का उपयोग करें।

यदि यह एक गतिशील बनावट है, जिसका अर्थ है कि आप अक्सर सीपीयू से नई सामग्री प्रदान करते हैं (सीपीयू-आधारित वीडियो प्लेबैक कैननिकल केस है: प्रति फ्रेम एक बार सीपीयू द्वारा डेटा प्रदान किया जाता है, फिर प्रति फ्रेम एक बार GPU द्वारा पढ़ा जाता है) आप शायद USAGE_DYNAMIC और विकल्प (2) का उपयोग करना चाहते हैं। USAGE_DYNAMIC बनावट को GPU पढ़ने के बजाय CPU से GPU तक डेटा स्ट्रीम करने के लिए अनुकूलित किया गया है। विवरण (और प्रदर्शन प्रभाव) हार्डवेयर विक्रेताओं के बीच भिन्न होते हैं, लेकिन आम तौर पर आप केवल USAGE_DYNAMIC का उपयोग करना चाहते हैं यदि आप वास्तव में सीपीयू से GPU तक डेटा स्ट्रीम कर रहे हैं, बल्कि यह स्थिर डेटा अप-फ्रंट लोड करने का एक सुविधाजनक तरीका है।

विकल्प (3) अधिक विशिष्ट है, और प्रारंभिक डेटा लोड के लिए स्थिर बनावट में उपयोग किया जा सकता है (कई बनावट के लिए डेटा लोड करने के लिए स्टेजिंग सतह का पुन: उपयोग करें) या अपेक्षाकृत गतिशील उपयोग के लिए डेटा स्ट्रीमिंग के लिए। यह आपको GPU/CPU सिंक्रनाइज़ेशन और स्थानांतरण के लिए उपयोग की जाने वाली इंटरमीडिएट मेमोरी पर सटीक नियंत्रण देता है। आम तौर पर आप स्टेजिंग बफर की एक अंगूठी और D3D11_MAP_FLAG_DO_NOT_WAIT का उपयोग यह जांचने के लिए करेंगे कि प्रत्येक बफर अभी भी पिछले CopyResource द्वारा उपयोग में है या नहीं। मैं इसे एक विशेषज्ञ विकल्प मानता हूं - यदि आप सावधान नहीं हैं तो आप सीपीयू और जीपीयू को असीमित रूप से चलने से रोककर बुरी तरह से पीड़ित हो सकते हैं।

पूर्ण प्रकटीकरण: मैं एनवीडिया में डी 3 डी चालक पर काम करता हूं, लेकिन ये मेरी व्यक्तिगत राय हैं।