यदि आप कोई वीडियो प्रोसेसिंग नहीं कर रहे हैं, तो मुझे IDirect3DDeviceManager9
इंटरफ़ेस को कार्यान्वित करने और/या उपयोग करने में कोई बिंदु नहीं दिखाई देता है।
डायरेक्ट 3 डी डिवाइस के जीवनकाल के प्रबंधन के अपने तरीके को लागू करें, जिससे इंटरफ़ेस पॉइंटर आपके ऑब्जेक्ट/थ्रेड पर उपलब्ध हो और सिंक्रनाइज़ेशन करें। एक डायरेक्ट 3 डी डिवाइस किसी भी तरह की जादुई चीज़ नहीं है जिसे केवल IDirect3DDeviceManager9
के माध्यम से वस्तुओं/धागे के बीच साझा किया जा सकता है। यह किसी भी अन्य संसाधन की तरह है। और यदि आप इसे सही तरीके से प्रारंभ करते हैं, तो आप अलग-अलग थ्रेडों से समसामयिक तरीकों को भी कॉल कर सकते हैं (यानी बहुत कुछ जो डिवाइस डिवाइस पर भरोसा नहीं करता है जिसे किसी अन्य थ्रेड द्वारा बदला जा सकता है)।
इंटरफ़ेस पॉइंटर उपलब्ध करना पॉइंटर धारण करने वाले सिंगलटन के रूप में सरल हो सकता है। या, यदि आपकी ऑब्जेक्ट्स/धागे पहले से ही किसी भी तरह से सहयोग करते हैं, तो उनके पास पहले से ही जानकारी का आदान-प्रदान करने का कुछ साधन होना चाहिए। तो मुझे लगता है कि आप केवल वही विस्तार करने में सक्षम होना चाहिए जो आपको पहले से ही ऑब्जेक्ट/थ्रेड को Direct3D डिवाइस तक पहुंचाने के लिए है। और CRITICAL_SECTION
का उपयोग कर सिंक्रनाइज़ेशन आसानी से किया जा सकता है।
तुम सच में तो IDirect3DDeviceManager9
उपयोग करने के लिए, चाहते हैं, तो - जहाँ तक मैं यह समझ के रूप में - आप सभी वस्तुओं जिसमें से आप IDirect3DDeviceManager9
के लिए उपयोग करना चाहते हैं पर IMFGetService
इंटरफ़ेस को लागू करने की है। GetService
फ़ंक्शन को कार्यान्वित करें ताकि जब MR_VIDEO_ACCELERATION_SERVICE
/IDirect3DDeviceManager9
के लिए पूछा जाए तो यह आपके डायरेक्ट 3 डी डिवाइस को प्रबंधित करने वाली ऑब्जेक्ट में एक इंटरफ़ेस पॉइंटर देता है।
संपादित करें: कोड नमूना के बारे में: मुझे आशा है कि स्पष्टीकरण यहाँ दी पर्याप्त है। एकाधिक धागे के बीच सामान साझा करना कुछ ऐसा है जो मुझे एक संक्षिप्त कोड-नमूना के साथ व्याख्या करने की कोशिश नहीं करता है। यदि आप बहु-थ्रेडेड अनुप्रयोगों को लिखना चाहते हैं, तो डायरेक्ट 3 डी डिवाइस का उपयोग करना अन्य संसाधनों के साथ कैसे किया जाता है उससे अलग नहीं है। और यदि आप नहीं जानते कि बहु-थ्रेडेड अनुप्रयोगों को कैसे लिखना है तो वह विषय एक ही स्टैक ओवरफ्लो उत्तर के लिए बहुत जटिल है।
प्रश्न के संबंध में एमएस IDirect3DDeviceManager9
का उपयोग करने की सिफारिश क्यों करता है ... अच्छा, मुझे ऐसी सामान्य सिफारिश के बारे में पता नहीं है।वीडियो प्रोसेसिंग (डीएक्सवीए, ईवीआर इत्यादि का उपयोग करते समय) की सिफारिश की जाती है। या अधिक अनिवार्य की तरह; मुझे यकीन नहीं है कि आप डी 3 डी डिवाइस को उदा। डी 3 डी डिवाइस मैनेजर का उपयोग किए बिना उन्नत वीडियो रेंडरर। यही कारण है कि डी 3 डी डिवाइस मैनेजर सभी के लिए बनाया गया था।
प्रलेखित रास्ता: ही कभी VMR9 की "वर्तमान" कॉलबैक से उपकरण में पहुंच VMR9 दाता के साथ एक उपकरण को साझा के साथ दो तरह से ही संभव था। जो सीमित है - उदा। आप वीडियो की फ्रेम दर तक ही सीमित हैं।
अनियंत्रित तरीका:IVMRFilterConfig9::SetNumberOfStreams
पर कॉल न करें और केवल एक इनपुट स्ट्रीम कनेक्ट करें। इस तरह वीएमआर 9 "मिक्सर मोड" पर स्विच नहीं करेगा, और जब "मिक्सर मोड" में नहीं होगा तो वीएमआर 9 किसी भी डिवाइस स्टेटस को नहीं बदलेगा। इसलिए यदि डी 3 डी डिवाइस को बहुप्रचारित प्रारंभ किया गया था, तो आप उसी डिवाइस का उपयोग कर VMR9 का उपयोग कर मुक्त रूप से D3D डिवाइस का उपयोग कर सकते हैं।
इसके अलावा वीएमआर 9 के साथ अन्य डायरेक्टशो फ़िल्टर में डी 3 डी डिवाइस का उपयोग करना संभव नहीं था। डी 3 डी डिवाइस मैनेजर उस पर सुधार करता है, फ़िल्टर और अपने स्वयं के एप्लिकेशन कोड को डी 3 डी डिवाइस का उपयोग करने की क्षमता देता है - जिसमें बदलते राज्य शामिल हैं। यदि आप प्रत्येक घटक को लागू करते हैं जो स्वयं डी 3 डी डिवाइस का उपयोग करेगा, तो डी 3 डी डिवाइस मैनेजर में वास्तव में कोई बिंदु नहीं है। और यहां तक कि यदि आप तीसरे पक्ष के घटकों का उपयोग कर रहे हैं जिसके लिए एक डी 3 डी डिवाइस की आवश्यकता है तो आप केवल डी 3 डी डिवाइस मैनेजर का उपयोग करने में सक्षम होंगे यदि वे घटक इसका समर्थन करते हैं। जो तब तक मामला नहीं होगा जब तक कि उन घटकों को DirectShow या MediaFoundation फ़िल्टर/घटक न हों।