सबसे पहले आपको यह समझने की आवश्यकता है कि आप जो कर रहे हैं वह बहुत अजीब है!
एक बनावट लोड करने का "सामान्य" तरीका सामग्री पाइपलाइन और सामग्री प्रबंधक का उपयोग करना है।
यदि आपको वास्तव में फ़ाइल से बनावट लोड करना है, न कि सामग्री प्रणाली - आपको प्रत्येक बनावट के लिए केवल एक बार ऐसा करना चाहिए। आपको Texture2D.FromFile
Game.LoadContent
में Dispose
पर कॉल करना चाहिए और Game.UnloadContent
में सामान्य रूप से सामग्री प्रबंधक कॉल करना होगा - लेकिन क्योंकि आप सामग्री प्रबंधक से नहीं जा रहे हैं, आपको कॉल करना होगा स्वयं को निपटाना)।
महत्वपूर्ण बात यह एहसास है कि तुम दोनों में कामयाब रहे और अप्रबंधित संसाधनों यहाँ के साथ काम कर रहे हैं।
स्मृति प्रबंधित वस्तुओं द्वारा किया जा रहा कचरा कलेक्टर द्वारा नियंत्रित किया जाएगा - इस मामले में Texture2D के प्रत्येक उदाहरण के एक छोटे कामयाब स्मृति के बिट का उपयोग करता है। 99% बार आपको इसके बारे में चिंता करने की आवश्यकता नहीं है - कचरा कलेक्टर प्रबंधित स्मृति को संभालने में वाकई अच्छा है - यह उसका काम है!
क्या आप को अप्रबंधित संसाधनों के बारे में चिंता करने की आवश्यकता है - इस मामले में बनावट इन सभी बनावटों द्वारा बनावट बनावट का उपयोग किया जा रहा है। आखिरकार कचरा कलेक्टर चलाएगा, इन सभी असुरक्षित बनावट 2 डी ऑब्जेक्ट्स देखें और उन्हें एकत्र करें। जब यह उन्हें एकत्रित करता है तो यह उन्हें अंतिम रूप देगा, जो निपटान को कॉल करने की तरह, अप्रबंधित संसाधनों को छोड़ देगा।
लेकिन कचरा कलेक्टर इन सभी Textman2D ऑब्जेक्ट्स का उपयोग कर रहे सभी अप्रबंधित संसाधनों को "देख" नहीं सकता है। यह नहीं पता कि उन वस्तुओं को कब जारी किया जाना चाहिए - आप स्वयं को बेहतर काम कर सकते हैं। आपको बस अपने बनावट पर Dispose
पर कॉल करना है जब उन्हें अब आवश्यकता नहीं है।
यह क्योंकि कचरा कलेक्टर अपनी संरचनाओं द्वारा प्रयोग किया जाता अतिरिक्त स्मृति की कि 30MB के बारे में पता नहीं है कि यह संचित किया जा रहा है आप निपटान बुला नहीं कर रहे हैं जब है,। इसके अतिरिक्त, जब आप प्रक्रिया मेमोरी उपयोग को देखते हैं तो आप क्या नहीं देख सकते हैं, GPU पर सभी मेमोरी है कि वे बनावट उपयोग कर रहे हैं!
(बनावट 2 डी का अंतर्निहित कार्यान्वयन यह है कि यह एक डायरेक्टएक्स बनावट वस्तु का संदर्भ रखता है - जो स्वयं अप्रबंधित मुख्य स्मृति का उपयोग कर एक अप्रबंधित वस्तु है - जो बदले में जीपीयू पर बनावट और इसकी संबंधित मेमोरी को नियंत्रित करता है। अब जो ऊपर उल्लिखित संदर्भ और बनावट की चौड़ाई, ऊंचाई, प्रारूप की एक कैश और इतने पर संग्रहीत करता है)
- - एक Texture2D वस्तु का केवल लगभग 100-200 बाइट है। के लिए के रूप में आप क्या हासिल करने की कोशिश कर रहे हैं । आप वास्तव में एक बनावट हर फ्रेम लोड करने के लिए (इस अत्यधिक असामान्य है), और आप फिर भी नहीं रह गया है पिछले बनावट की जरूरत है एक की जरूरत ...
ठीक है, सब से पहले, पर Dispose
बुला है, तो अप्रयुक्त बनावट प्रत्येक फ्रेम एक मान्य विधि है। आप कचरा कलेक्टर सब कचरा इस बनाता है (Texture2D वस्तुओं की कामयाब पक्ष) को साफ करने के आधार पर किया जाएगा - यह विंडोज पर ठीक है पर Xbox पर अपने प्रदर्शन को मारने सकता है। कम से कम आप अप्रबंधित संसाधनों को लीक नहीं करेंगे।
एक बेहतर तरीका, विशेष रूप से यदि बनावट हर बार एक ही आकार है, तो केवल उसी बनावट वस्तु का उपयोग करना जारी रखना है। फिर प्रत्येक फ्रेम के नए बनावट डेटा के साथ Texture2D.SetData
पर कॉल करें।
(अपनी संरचनाओं विभिन्न आकारों हैं, या आप एक निश्चित समय पर उपयोग में एक से अधिक है, तो आप एक बनावट पूल की तरह कुछ को लागू करने की आवश्यकता हो सकती है।)
बेशक
, LoadFile एक वास्तविक फ़ाइल लेता है, सेटडाटा कच्चा डेटा लेता है। आपको डेटा रूपांतरण स्वयं लागू करना होगा। एक अच्छा प्रारंभिक बिंदु this thread on the XNA forum हो सकता है।