2013-11-01 38 views
0

我想要做的是Load() XNA使用內容管理器的音效,並自動創建一個實例來控制播放。當聲音不再需要時,我想知道如何正確Unload()它從內存?正確結束SoundEffectInstance

此外,我想知道是否需要Unload()。當我撥打Load()兩次時,第二個電話是否能正確釋放第一個電話的記憶?我猜測C#垃圾回收器會自動處理舊效果和實例,因爲它們被第二次調用覆蓋。它是否正確?

這些都是在我的自定義MySoundEffect類的參數:

// Has sound effect been loaded? 
bool loaded; 

// Store our SoundEffect resource 
SoundEffect effect; 

// Instance of our SoundEffect to control playback 
SoundEffectInstance instance; 

此方法加載聲音。

public void Load(String location) 
{ 
    effect = Content.Load<SoundEffect>(location); 

    if (effect != null) loaded = true; 
    else 
    { 
     Error.Happened("Loading of sound effect " + location + " failed."); 
     return; 
    } 

    // Create instance 
    instance = effect.CreateInstance(); 
} 

這時候不再需要聲音叫:

public void Unload() 
{ 
    loaded = false; 

    instance.Dispose(); 

    effect.Dispose(); 
} 

回答

1

如果你想卸載一個聲音,你可以調用Dispose方法,但重要的是,你再也不需要它,或你會收到一個處置元素的excepion。
您可以創建第二個ContentManager,您可以在其中載入您僅使用一次的聲音,然後使用Unload它。

要回答你的第二個問題,你就錯了:

ContentManager的每個實例將只加載任何給定的資源 一次。第二次請求資源時,它將返回上次返回的相同 實例。

要做到這一點,ContentManager會維護一個列表,其中包含內部加載的所有內容 。這個列表可以阻止垃圾收集器清除這些資源 - 即使你不使用它們。

+0

因此,當我覆蓋使用ContentManager加載的資產的所有引用時,它仍然沒有被垃圾收集器處置?這不會完全破壞GC的感覺嗎? –

+0

我想你需要手動卸載他們調用Content.Unload()。 – pinckerman

+0

是否[this](http://stackoverflow.com/questions/19911006/garbage-collector-behaviour/19911036?noredirect=1#19911036)與此相矛盾? –