मुझे कैसे पता चलेगा कि मेमोरी सही से हैंडल नहीं हो रही है?


12

मेरे (2D) गेम की मेमोरी फ़ुटप्रिंट किसी भी समय बढ़ जाती है, जब मैं किसी बनावट को लोड करता हूं, उदा। जब मैं अपना गेम शुरू करता हूं तो यह 30 mb निजी RAM का उपयोग करता है, ~ 367mb बैकग्राउंड फ़ाइल को ट्रांसवर्स करने के बाद, इसलिए यह सभी रैम में कुछ बिंदु पर होता है, यह बढ़ जाता है: 54 एमबी निजी रैम।

एक ही बात समान दूरी पर जाने के बाद होती है लेकिन बार-बार दो बिंदुओं के बीच आगे-पीछे होती है।

हालाँकि, मेरे रीडआउट दिखा रहे हैं कि कार्यक्रम सही ढंग से glDeleteTextures बुला रहा है एक दूसरे के बारे में बनावट के बाद स्क्रीन पर जाना; और वाल्ग्रिंड कोई लीक नहीं पा रहा है।

मुझे कैसे पता चलेगा कि मुझे इस बारे में चिंतित होना चाहिए, या अगर यह सिर्फ ओएस पृष्ठों की स्मृति के बारे में एक प्रश्न है?


1
आपने अपने एप्लिकेशन के RAM उपयोग का निर्धारण कैसे किया? क्या आप एक प्रोफाइलर का उपयोग कर रहे हैं (कौन सा?) या क्या आप अपने ऑपरेटिंग सिस्टम के कार्य प्रबंधक (जो एक) पर भरोसा करते हैं?
फिलीपींस

1
KUbuntu पर कार्य प्रबंधक, मेरे डिबगर पर प्रोफाइलर मुझे बताता है कि यह डेटा की प्रतीक्षा कर रहा है, फिर कभी कुछ भी प्रदर्शित नहीं करता है।
पैट्रिक

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

2
आपको इस बात की कोई उम्मीद नहीं होनी चाहिए कि glDeleteTextures वास्तव में मुफ्त मेमोरी: gamedev.stackexchange.com/questions/136883/…
मैक्सिमस मिनिमस

जवाबों:


21

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

उपयोगकर्ता-अंतरिक्ष में आवंटन पुस्तकालय भी बार-बार मांग करने और / से ओएस पर स्मृति को जारी करने से बचने के लिए पुन: उपयोग के लिए एक निश्चित राशि रखते हैं जो बेहद धीमी है।

जैसे आप एक बनावट आवंटित करते हैं, OpenGL ड्राइवर 32 बनावट स्लॉट की एक तालिका रखता है, आप बनावट को आवंटित करते रहते हैं, ड्राइवर को 1024 बनावट स्लॉट की एक बड़ी तालिका आवंटित करने की आवश्यकता होती है यह नई तालिका अब रैम के बड़े हिस्से में जगह ले रही है, आप सभी बनावटों से मुक्त, ड्राइवर इस तालिका में न तो सिकुड़ रहा है और न ही उस तालिका को फिर से आवंटित कर रहा है कि आपके खेल / एप्लिकेशन को बाद में कई बनावट का उपयोग करने की आवश्यकता होगी ताकि रैम का बड़ा हिस्सा ओएस पर वापस न छोड़ा जा सके।

यह पूरी तरह से सामान्य और वांछित है। अप्रयुक्त रैम का आपके ऐप द्वारा अंततः उपयोग किया जाएगा।


1
ध्यान देने योग्य बात यह है कि यदि नाटक के दौरान उपयोग में वृद्धि जारी है, लेकिन रिसाव डिटेक्टरों को अभी भी कुछ नहीं मिला है, तो आप अत्यधिक मेमोरी फ़्रेग्मेंटेशन से पीड़ित हो सकते हैं। पर दिए गए वर्णन इस तरह के एक समस्या को हल करने के लिए दृष्टिकोण stackoverflow.com/questions/150753/... भी खेल के विकास के लिए उपयोगी होगा।
जूल्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.