1

我想要做的是Load()使用内容管理器在 XNA 中创建音效并自动创建一个实例来控制播放。当不再需要声音时,我想知道如何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();
}
4

1 回答 1

1

如果您想卸载单个声音,您可以调用Dispose方法,但重要的是您再也不需要它,否则您将收到已处置元素的异常。
您可以创建第二个ContentManager,您可以在其中加载您只使用一次的声音,然后加载Unload它。

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

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

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

于 2013-11-02T01:23:23.293 回答