2010-11-24 9 views
9

मैंने texture2d पर निपटान फ़ंक्शन का उपयोग करने का प्रयास किया लेकिन इससे समस्याएं आईं और मुझे पूरा यकीन है कि यह मेरे द्वारा उपयोग करने के लिए नहीं है।मैं सामग्री प्रबंधक से सामग्री को कैसे उतारूं?

मूल रूप से सामग्री को अनलोड करने के लिए मुझे क्या उपयोग करना चाहिए? क्या सामग्री प्रबंधक खुद को ट्रैक रखता है या क्या मुझे कुछ करना है?

+0

संभव डुप्लिकेट कैसे XNAs Content.Load संचालित?] (Http://stackoverflow.com/questions/4242741/how-does-xnas-content-loadtexture2d-operate) –

उत्तर

12

मेरे उत्तरों here और संभवतः here पर एक नज़र डालें।

ContentManager यह लोड करने वाली सभी सामग्री का "स्वामित्व" है और इसे उतारने के लिए ज़िम्मेदार है। सामग्री प्रबंधक को लोड करने वाली सामग्री को अनलोड करने का एकमात्र तरीका ContentManager.Unload() (MSDN) का उपयोग कर है।

यदि आप ContentManager के इस डिफ़ॉल्ट व्यवहार से खुश नहीं हैं, तो आप इसे this blog post में वर्णित अनुसार प्रतिस्थापित कर सकते हैं।

किसी भी बनावट या अन्य अनलोड करने योग्य संसाधन है कि आप अपने आप को बनानेContentManager माध्यम से जा रहा बिना अपने Game.UnloadContent समारोह में (Dispose() फोन करके) निपटारा किया जाना चाहिए।

+0

एक ContentManager भी है। अनलोड (बूल डिस्पोजेक्ट) जिसे वर्णित प्रबंधित सामग्री के रूप में वर्णित किया गया है सच। क्या xna लाइब्रेरी में xna सामग्री प्रकार हैं जो प्रबंधित हैं और मैन्युअल निपटान की आवश्यकता है? – Wouter

+1

@ वाउटर अनलोड एमएसडीएन पर देखे गए किसी भी संस्करण में कोई तर्क नहीं लेता है। आप 'निपटान (बूल निपटान)' (जो एक संरक्षित विधि है, बाहरी रूप से कॉल नहीं कर सकता) देख रहे हैं। यह मानक सी # डिस्पोजेबल पैटर्न का हिस्सा है ([यहां समझाया गया है] (http://msdn.microsoft.com/en-us/library/fs2xkftw.aspx))। 'निपटान (सत्य)' मानक निपटान के दौरान बुलाया जाता है ('कथन का उपयोग' या सीधे 'निपटान() ') को कॉल करना और खुद को' अनलोड()' कहलाएगा। 'निपटान (झूठा)' को अंतिम रूप से बुलाया जाता है और विशेष रूप से 'अनलोड' नहीं कहता है (यह अन्य ऑब्जेक्ट्स तक नहीं पहुंच सकता है, हो सकता है कि वे पहले से ही अंतिम रूप दिए गए हों)। –

1

आप एक बनावट निपटान के लिए चाहते हैं, तो सबसे आसान तरीका है यह करने के लिए:

SpriteBatch spriteBatch; 
    Texture2D texture; 
    protected override void LoadContent() 
    { 
     spriteBatch = new SpriteBatch(GraphicsDevice); 
     texture = Content.Load<Texture2D>(@"Textures\Brick00"); 
    } 
    protected override void Update(GameTime gameTime) 
    { 
     // Logic which disposes texture, it may be different. 
     if (Keyboard.GetState().IsKeyDown(Keys.D)) 
     { 
      texture.Dispose(); 
     } 

     base.Update(gameTime); 
    } 
    protected override void Draw(GameTime gameTime) 
    { 
     GraphicsDevice.Clear(Color.CornflowerBlue); 
     spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.LinearWrap, DepthStencilState.None, RasterizerState.CullCounterClockwise, null); 

     // Here you should check, was it disposed. 
     if (!texture.IsDisposed) 
      spriteBatch.Draw(texture, new Vector2(resolution.Width/2, resolution.Height/2), null, Color.White, 0, Vector2.Zero, 0.25f, SpriteEffects.None, 0); 

     spriteBatch.End(); 
     base.Draw(gameTime); 
    } 

आप खेल बाहर निकलने के बाद सभी सामग्री निपटान के लिए चाहते हैं, तो सबसे अच्छा तरीका यह करने के लिए:

protected override void UnloadContent() 
    { 
     Content.Unload(); 
    } 

आप खेल बाहर निकलने के बाद ही बनावट निपटान के लिए करना चाहते हैं:

protected override void UnloadContent() 
    { 
     texture.Dispose(); 
    } 
की [
संबंधित मुद्दे