2013-11-01 35 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)与此相矛盾? –