2010-12-29 11 views
14

ओपनजीएल प्रोग्राम विकसित करते समय, सिस्टम से मतदान करने का कोई तरीका है यह पता लगाने के लिए कि बनावट स्टोर करने के लिए कितने मेगाबाइट उपलब्ध हैं?उपलब्ध वीडियो मेमोरी निर्धारित करना

या इन दिनों मानक दृष्टिकोण सिर्फ स्मृति आवंटित करता है और सबकुछ भूल जाता है?

उत्तर

12

ओपनजीएल आपको यह जानकारी नहीं देता है। और स्पष्ट रूप से: केवल थोड़ा लाभ है, क्योंकि आज हमारे पास ऑपरेटिंग सिस्टम मल्टीटास्किंग है। यदि ओपनजीएल ड्राइवर इसकी मांग कर रहा है, तो सिस्टम मेमोरी से बनावट डेटा में स्वैपिंग के लिए ज़िम्मेदार है।

ओपनजीएल आपके लिए क्या कर सकता है, बताएं, अगर आपके द्वारा अपलोड किए गए बनावट अभी भी तेज़ स्मृति में निवासी हैं। फ़ंक्शन को "glAreTexturesResident" कहा जाता है। जब तक आप GPU की स्मृति को भर नहीं लेते हैं, तब तक आप GPU को धीरे-धीरे सामग्री अपलोड करने के लिए इसका उपयोग कर सकते हैं। लेकिन ध्यान रखें कि आप GPU का एकमात्र उपयोगकर्ता नहीं हैं।

+6

बस इसे यहां जोड़ना ताकि अन्य लोग यहां जा सकें: 'glAreTexturesResident' को कोर प्रोफाइल में बहिष्कृत किया गया है, इस प्रकार उन्हें आधुनिक ओपनजीएल कार्यक्रम में उपयोग करने के लिए समझदारी नहीं है। – legends2k

39

हालांकि आधिकारिक रुख बनी हुई है, "आपको पता नहीं होना चाहिए, आप जानना नहीं चाहते हैं, और यह आपकी मदद नहीं करेगा", सौभाग्य से कम से कम दो आईएचवी ने हाल ही में थोड़ा और अंतर्दृष्टि दिखाया है और एक्सटेंशन प्रदान करते हैं उस जानकारी को क्वेरी करने के लिए:

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

सबसे आसान मामले में, आप केवल 4 पूर्णांकों की सरणी को शून्य में शुरू कर सकते हैं (या कुछ न्यूनतम डिफ़ॉल्ट मान जो आप मानते हैं कि एक्सटेंशन काम नहीं करते हैं), तो आप glGetIntegerv दो बार कॉल करें (GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX के साथ और TEXTURE_FREE_MEMORY_ATI क्रमशः), और अंत में त्रुटि स्थिति को साफ़ करने के लिए glGetError पर कॉल करें। glGetIntegerv इंगित होने पर इंगित करने वाली स्मृति को संशोधित नहीं करता है, न ही यह क्रैश या कोई अन्य बुरी चीज करता है - यह केवल त्रुटि स्थिति को GL_INVALID_ENUM पर सेट करता है।

दोनों एक्सटेंशन पहले सरणी स्थिति में एक मान वापस करते हैं, अति एक दूसरे 3 में कुछ मान देता है।

एनबी .: glAreTexturesResident मुख्यधारा के हार्डवेयर पर लगभग एक दशक तक समर्थित नहीं किया गया है, वैसे ही बनावट प्राथमिकताओं के समान। आम मंत्र यह है कि चालक लेखक वैसे भी आपके से बेहतर जानता है।

+0

मुझे इन एक्सटेंशन क्यों नहीं मिलते हैं? मैं आखिरी JOGL का उपयोग कर रहा हूं ... – elect

+0

मैं जॉगएल का उपयोग नहीं कर रहा हूं, इसलिए मुझे नहीं पता, लेकिन जीएल 2 और जीएल 3 इंटरफेस के लिए प्रलेखन में कम से कम एक व्यावहारिक स्पष्टीकरण है: _ "इसका अधिकांश समर्थन करता है [एसआईसी ] इस विनिर्देश के समय परिभाषित एक्सटेंशन "_। इसका मतलब क्रमशः सितंबर 2004 और अगस्त 2008 है, जिसमें उपरोक्त दो एक्सटेंशन (मार्च और दिसंबर 200 9) शामिल नहीं हैं। इस प्रकार, यदि आप इन दो इंटरफेस में से किसी एक का उपयोग करते हैं, तो यह एक व्यावहारिक स्पष्टीकरण होगा (दूसरा यह है कि आपका ग्राफिक्स ड्राइवर वास्तव में एक्सटेंशन का समर्थन नहीं करता है)। – Damon

+2

वैसे भी, आपको एक्सटेंशन के लिए वास्तव में "समर्थन" की आवश्यकता नहीं है। जैसा ऊपर बताया गया है, वे 'glGetIntegerv' का उपयोग करते हैं - केवल स्थिरांक का उपयोग करें (जो spec फ़ाइलों में हैं)। यह काम करेगा, या यह काम नहीं करेगा। एक उचित डिफ़ॉल्ट मान चुनें, और यह उतना ही अच्छा है जितना आप प्राप्त कर सकते हैं। – Damon

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