C# 正确结束SoundEffectInstance

C# 正确结束SoundEffectInstance,c#,.net,audio,xna,xna-4.0,C#,.net,Audio,Xna,Xna 4.0,我想做的是使用Content Manager在XNA中加载一个声音效果,并自动创建一个实例来控制播放。当声音不再需要时,我想知道如何正确地Unload()it from memory 此外,我想知道是否需要Unload()。当我调用Load()两次时,第二次调用是否正确地释放了第一次调用的内存?我猜C#垃圾收集器会在第二次调用覆盖旧的效果和实例时自动处理它们。这是正确的吗 以下是我的自定义MySoundEffect类中的参数: // Has sound effect been loaded? b

我想做的是使用Content Manager在XNA中加载一个声音效果,并自动创建一个实例来控制播放。当声音不再需要时,我想知道如何正确地
Unload()
it from memory

此外,我想知道是否需要
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();
}

如果要卸载单个声音,可以调用
Dispose
方法,但重要的是不要再需要它,否则会收到一个额外的disposed元素。
您可以创建第二个
ContentManager
,在这里您可以加载只使用一次的声音,然后
卸载它

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

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

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


如果要卸载单个声音,可以调用
Dispose
方法,但重要的是不要再需要它,否则会收到一个额外的disposed元素。
您可以创建第二个
ContentManager
,在这里您可以加载只使用一次的声音,然后
卸载它

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

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

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


所以,当我覆盖对使用ContentManager加载的资产的所有引用时,它仍然没有被垃圾收集器处理?这不会完全破坏GC的意义吗?我认为您需要通过调用Content.unload()手动卸载它们。这与此矛盾吗?我引用了答案。我信任一个拥有19k代表点数的用户。如果你再看一次这个问题,你会发现答案已经改变,正如我告诉你的。所以,当我覆盖使用ContentManager加载的资产的所有引用时,垃圾收集器仍然没有处理它?这不会完全破坏GC的意义吗?我认为您需要通过调用Content.unload()手动卸载它们。这与此矛盾吗?我引用了答案。我信任一个拥有19k代表分数的用户。如果你再看一次这个问题,你会发现答案已经改变,正如我告诉你的。
public void Unload()
{
    loaded = false;

    instance.Dispose();

    effect.Dispose();
}