正确结束SoundEffectInstance

时间:2013-11-01 12:35:40

标签: c# .net audio xna xna-4.0

我想要做的是使用内容管理器在XNA中Load()音效,并自动创建一个实例来控制播放。当不再需要声音时,我想知道如何从记忆中正确地Unload()

此外,我想知道是否需要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 个答案:

答案 0 :(得分:1)

如果您想要卸载单个声音,可以调用Dispose方法,但重要的是您再也不需要它,否则您将获得一个处理元素的例外。
您可以创建第二个ContentManager,您可以在其中加载仅使用一次的声音,然后加载Unload

要回答你的第二个问题,你错了:

  

ContentManager的每个实例只会加载任何给定的资源   一旦。第二次请求资源时,它将返回相同的内容   它上次返回的实例。

     

为此,ContentManager维护其拥有的所有内容的列表   内部加载。此列表可防止垃圾收集器   清理这些资源 - 即使您没有使用它们。