2009-12-08 8 views
5

मैं एपटर रैम या ग्राफिक्स रैम प्राप्त करना चाहता हूं जिसे आप एपीआई का उपयोग कर डिस्प्ले सेटिंग्स या डिवाइस मैनेजर में देख सकते हैं। मैं सी ++ आवेदन में हूं।एपीआई

मैंने नेट पर सेरिंग करने की कोशिश की है और मेरे आरएनडी के अनुसार मैं निष्कर्ष निकाला हूं कि हम से ग्राफिक्स मेमोरी जानकारी प्राप्त कर सकते हैं 1. डायरेक्टएक्स एसडीके संरचना जिसे DXGI_ADAPTER_DESC कहा जाता है। लेकिन अगर मैं डायरेक्टएक्स एपीआई का उपयोग नहीं करना चाहता हूं तो क्या होगा। 2. Win32_videocontroller: लेकिन यह क्लास हमेशा आपको एडाप्टरआरएएम जानकारी नहीं देता है अगर वीडियो नियंत्रक की उपलब्धता ऑफलाइन है। मैंने इसे विस्टा पर चेक किया है।

क्या ग्राफिक्स रैम प्राप्त करने का कोई अन्य तरीका है?

+0

क्या आप ग्राफिक्स एडाप्टर पर ** ** ग्राफिक्स रैम एक्सेस करना चाहते हैं ** या ** ** रैम ** प्राप्त करें? – atzz

+0

बस ग्राफिक्स रैम की मात्रा चाहते हैं। – amritad

उत्तर

3

विंडोज़ पर ग्राफिक्स रैम सीधे प्राप्त करने का कोई तरीका नहीं है, विंडोज़ आपको ऐसा करने से रोकती है क्योंकि यह प्रदर्शित होने पर नियंत्रण बनाए रखती है।

हालांकि, आप डायरेक्टएक्स डिवाइस बना सकते हैं। बैक बफर सतह प्राप्त करें और फिर इसे लॉक करें। लॉक करने के बाद आप इसे जो कुछ भी चाहते हैं उसे भर सकते हैं और फिर अनलॉक कर सकते हैं और कॉल कर सकते हैं। यह धीमा है, हालांकि, आपको मुख्य मेमोरी में बस में वीडियो मेमोरी की प्रतिलिपि बनाना है। कुछ कार्ड्स "swizzled" प्रारूपों का भी उपयोग करते हैं, जिन्हें प्रतिलिपि बनाने के लिए इसे अनजान करना पड़ता है। इसमें ऐसा करने के लिए और समय लगता है और कुछ कार्ड आपको इसे करने से भी रोक देंगे।

आम तौर पर आप सीधे वीडियो कार्ड तक पहुंचने से बचने और विंडोज/डायरेक्टएक्स को आपके लिए ड्राइंग करने देना चाहते हैं। D3D1x Im के तहत 'सुनिश्चित करें कि आप इसे IDXGIOutput के माध्यम से कर सकते हैं। यह वास्तव में कोशिश करने और इससे बचने के लिए कुछ है ...

आप मानक win32 (यह उदाहरण सी मानता है) के माध्यम से एक रैखिक सरणी में लिख सकते हैं लेकिन इसमें काफी शामिल है।

सबसे पहले आपको रैखिक सरणी की आवश्यकता है।

unsigned int* pBits = malloc(width * height); 

फिर आपको बिटमैप बनाने और डीसी में इसे चुनने की आवश्यकता है।

HBITMAP hBitmap = ::CreateBitmap(width, height, 1, 32, NULL); 
    SelectObject(hDC, (HGDIOBJ)hBitmap); 

फिर आप कृपया पीबीआईएस सरणी भर सकते हैं। जब आप समाप्त कर लेंगे तो आप बिटमैप की बिट्स सेट कर सकते हैं।

::SetBitmapBits(hBitmap, width * height * 4, (void*)pBits) 

जब आप अपने बिटमैप का उपयोग कर इसे (DeleteObject प्रयोग करके) और मुक्त अपने रैखिक सरणी नष्ट करने के लिए मत भूलना समाप्त हो गया है!

संपादित करें: वीडियो रैम को विश्वसनीय रूप से प्राप्त करने का केवल एक ही तरीका है और यह डीएक्स डायग इंटरफेस के माध्यम से जाना है। डीएक्स एसडीके में IDxDiagProvider और IDxDiagContainer पर एक नज़र डालें।

+0

लिंक अब टूटा हुआ है (कम से कम सीधे उन चीज़ों का नेतृत्व न करें जो उन्हें माना जाता है)। – Ruslan

1

उपयोगकर्ता मोड धागे फ्रेमबफर सहित हार्डवेयर उपकरणों से मैप किए गए मेमोरी क्षेत्रों और I/O मैप तक नहीं पहुंच सकते हैं। वैसे भी, आप यह क्या करना चाहते हैं? मान लीजिए कि आप फ्रेमबफर को सीधे एक्सेस कर सकते हैं: अब आपको फ्रेमबफर में बहुत से संभावित पिक्सेल प्रारूपों को संभालना होगा। आप 32-बिट आरजीबीए या एआरजीबी संगठन मान सकते हैं। 15/16/24-बिट डिस्प्ले (आरजीबीए 555, आरजीबीए 5551, आरजीबीए 4444, आरजीबीए 565, आरजीबीए 888 ...) की संभावना है। ऐसा है कि आप वीडियो-सतह प्रारूपों (ओवरले) जैसे YUV- आधारित का भी समर्थन नहीं करना चाहते हैं।

तो डिस्प्ले ड्राइवर और/या उपजाऊ एपीआई को उस प्रयास को करने दें।

यदि आप एक प्रदर्शन सतह पर लिखना चाहते हैं (जो वास्तव में फ्रेमबफर मेमोरी के बराबर नहीं है, तो यह अवधारणात्मक रूप से लगभग समान है) बहुत सारे विकल्प हैं। डीएक्स, विन 32, या आप एसडीएल पुस्तकालय (libsdl) का प्रयास कर सकते हैं।

2

Win32_videocontroller gfx स्मृति की मात्रा प्राप्त करने का आपका सबसे अच्छा कोर्स है। इस तरह यह डूम 3 स्रोत में किया गया है।

आप कहते हैं ".. वीडियो नियंत्रक की उपलब्धता ऑफ़लाइन है। मैंने इसे विस्टा पर चेक किया है।" वीडियो नियंत्रक किस परिस्थिति में ऑफ़लाइन होगा?

संयोग से, you can find the Doom3 source here। जिस फ़ंक्शन को आप ढूंढ रहे हैं उसे Sys_GetVideoRam कहा जाता है और यह Win_shared.cpp नामक फ़ाइल में है, हालांकि यदि आप समाधान की विस्तृत खोज करते हैं तो यह आपके लिए इसे चालू कर देगा।