2010-02-06 20 views
8

क्या मुझे सभी डिस्प्लेलिस्ट, बनावट, (ज्यामिति-) शेडर्स को हाथ से ग्लैडलेट * फ़ंक्शंस के माध्यम से साफ करना है, या जब मेरा प्रोग्राम बाहर निकलता है/क्रैश होता है तो GPU mem स्वचालित रूप से मुक्त हो जाता है?ओपनजीएल जीपीयू मेमोरी क्लीनअप, आवश्यक है?

नोट: जीपीयू मेम एक समर्पित ग्राफिक्स कार्ड पर समर्पित स्मृति को संदर्भित करता है, सीपीयू मेमोरी नहीं।

+0

"है" की अपनी परिभाषा पर निर्भर करता है। आपको कुछ भी करने की ज़रूरत नहीं है। यदि आप "सही" होना चाहते हैं, हाँ; जब आप पूरा कर लेंगे तो आपको हमेशा अपने संसाधनों को छोड़ना होगा। – GManNickG

+0

मैं यह जानना चाहता था कि यह स्वचालित रूप से क्लीनअप हो जाएगा, * प्रोग्राम बंद होने के तुरंत बाद, या अगली रीबूट तक GPU स्मृति खो जाती है। मुझे उम्मीद थी कि कोई मुझे ओपनजीएल विनिर्देश की ओर इंगित कर सकता है और इसे वहां परिभाषित किया गया था (हालांकि मेरे पसंदीदा खोज इंजन ने मुझे कुछ भी उपयोगी नहीं किया था)। – drahnr

+0

दोनों! वास्तव में, अपने आप को साफ करें, भले ही ओएस आपके लिए करता है। आपको किसी भी 'नई' मेमोरी को कभी भी 'डिलीट' करने की ज़रूरत नहीं है, ओएस प्रोग्राम खत्म होने पर इसे मुक्त कर देगा, लेकिन फिर भी ऐसा कुछ नहीं है जो मैं सुझाता हूं। –

उत्तर

13

संदर्भ को निशुल्क करें, बाकी सब कुछ संदर्भ के लिए स्थानीय है (जब तक कि आप प्रदर्शन सूची साझाकरण सक्षम नहीं करते) और इसके साथ चले जाएंगे।

+0

क्या आप टिप्पणी करने में मदद कर सकते हैं कि क्या wglDeleteContext सभी मेमोरी जारी नहीं करता है? – SOUser

+0

@SOUser: क्या आपने संदर्भों के बीच संसाधन साझाकरण सक्षम किया था? तब संसाधनों को मुक्त कर दिया जाएगा जब अंतिम लिंक किए गए संदर्भ हटा दिए जाएंगे। यदि आपके पास सबूत हैं कि संदर्भ को हटाने की सफाई नहीं है, तो GPU ड्राइवर के साथ एक बग फ़ाइल करें। –

1

जब आपका प्रोग्राम निकलता है (या दुर्घटनाग्रस्त हो जाता है) तो वर्तमान में आवंटित की गई किसी भी मेमोरी को अंततः उसी तरह से मुक्त किया जाना चाहिए जब एक प्रोग्राम निकलता है तो मुख्य स्मृति आमतौर पर मुक्त हो जाती है। GPU "एहसास" से पहले कुछ समय हो सकता है कि स्मृति फिर से उपयोग के लिए उपलब्ध है।

हालांकि, आपको इस व्यवहार पर भरोसा नहीं करना चाहिए क्योंकि यह इस बात पर निर्भर करता है कि ग्राफिक्स कार्ड ड्राइवरों को कैसे लागू किया गया है। जब आप (प्रोग्रामर के रूप में) जानते हैं कि आपको उस स्मृति की फिर से आवश्यकता नहीं होगी, तो स्पष्ट रूप से कॉल साफ़ करने के लिए यह बेहतर है।

1

आपका प्रोग्राम समाप्त होने पर आपके सभी GPU संसाधन जारी किए जाएंगे। परीक्षण करने का एक आसान तरीका चीजों को हटाना नहीं है, और यह देखने के लिए बार-बार अपना ऐप चलाएं कि यह कुछ पुनरावृत्तियों के बाद आवंटन में विफल रहता है या नहीं।

8

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

बीटीडब्ल्यू, यह वह जगह है जहां मैं क्रिसफ़ के जवाब के साथ अपवाद लेता हूं। यह तय करने के लिए ड्राइवर को नहीं होना चाहिए कि इसे सफाई करने की आवश्यकता है। ओएस ड्राइवर मॉडल के पास उपयोगकर्ता-मोड ओपनजीएल ड्राइवर (जो वास्तविक जीएफएक्स संसाधन आवंटन नहीं करता है, क्योंकि यह मशीन में साझा किया गया है) के बीच एक स्पष्ट अंतरफलक होगा, ओएस (जो संसाधन आवंटित करने के लिए सिस्टम कॉल के बराबर प्रदान करता है) और कर्नेल-मोड ड्राइवर (जो केवल ओएस ऑर्डर को जीपीयू के साथ संगत करने के लिए निष्पादित करने के लिए है)। यह कम से कम WIN2K और WDDM मॉडल के मामले में है।

तो ... यदि आपकी प्रक्रिया क्रैश हो जाती है या अन्यथा समाप्त हो जाती है, तो उन मॉडलों में, प्रक्रिया के साथ जुड़े सभी संसाधनों को मुक्त करने के लिए कर्नेल-मोड ड्राइवर को कॉल करने की ओएस ज़िम्मेदारी है।

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

+0

मुझे लगता है कि मुझे "क्यों" मिल गया .. आपके उत्तर के लिए thx – drahnr

+0

ध्यान दें कि आप स्वयं के विरोधाभास कर रहे हैं। हां, ओएस क्लीनअप की आवश्यकता होने पर ड्राइवर को एक ईवेंट भेजता है ... लेकिन यह अभी भी ड्राइवर है जो वास्तविक काम करता है, और साफ करने में विफलता एक छोटी गाड़ी चालक की गलती है। –

+0

@ बेनवॉजिट: मेरा मतलब स्पष्ट करने की कोशिश की गई। क्या वो बेहतर है? – Bahbar

-1

ओपनग्ल में, ड्राइंग जानकारी को स्टोर करने की कोई स्मृति नहीं है। यहां, जब हम ओपनगल प्रोग्राम निष्पादित करते हैं, उस समय अनुक्रमिक रूप से कॉल फ्रेम विधि को कॉल करना। वैसे भी, यदि हम एक रेखा या सर्कल का अर्थ खींचते हैं, तो कभी भी इसकी कॉलिंग निर्दिष्ट जगह पर ड्राइंग के लिए फ्रेम विधि खींचती है। लेकिन, opengl उस पंक्ति को स्मृति में संग्रहीत नहीं करता है। कभी भी, इसकी ड्राइंग केवल। लेकिन, जब हमने देखा, वह लाइन सफलतापूर्वक शुरू हुई है।

पूर्व: एंड्रॉइड ओपनगल es2.0 में लाइनों या मंडलियों आदि को आकर्षित करने के लिए ड्रॉफ्रेम विधि (ड्रॉ विधि के अंदर) के अंदर इस रेंडरर क्लास का उपयोग किया गया .. मैंने एंड्रॉइड ऑटोकाड ऐप डेवलपमेंट में इस ओपनग्ल एएस 2.0 प्रोग्राम का उपयोग किया .. यदि आप सुबह की लाइनों को साफ़ करना चाहते हैं तो इस विधि का उपयोग रेंडरर क्लास में ड्रेफ्रेम विधि GLES20.glClearColor (0.0f, 0.0f, 0.0f, 1.0f); GLES20.glClear (GLES20.GL_COLOR_BUFFER_BIT); GLES20.glClear (GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);

+0

वैसे, निश्चित रूप से यह किसी भी खींची गई ज्यामिति को संग्रहीत नहीं करता है, लेकिन यह सीपीयू और जीपीयू मेमोरी दोनों में अन्य चीजों का पूरा गुच्छा स्टोर करता है। सबसे अच्छा उदाहरण, वह रेखा कहां खींची गई है और आप इसे क्यों देख सकते हैं? –

+0

हाय क्रिश्चियन राउ, आप सही हैं। मैंने केवल जीपीयू मेमोरी स्टोरेज के बारे में कहा .. मुझे ऊपर उल्लिखित समस्या का सामना करना पड़ रहा है। कृपया यह लिंक देखें और यदि संभव हो तो कृपया इस संघर्ष से मेरी सहायता करें। http://stackoverflow.com/questions/17187032/why-my-opengl-output-differs-for-various-devices कृपया इस लिंक से इस नमूना कोड को भी देखें http://tuxbalaji.wordpress.com/2013/06/ 19/आकर्षित एक लाइन का उपयोग कर-opengles2-0-दर-स्पर्श घटना में एंड्रॉयड / – harikrishnan

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