我想做的是使用Content在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();
}发布于 2013-11-02 01:23:23
如果您想卸载单个声音,您可以调用Dispose方法,但重要的是再也不需要它了,否则您将收到异常的已处理元素。
您可以创建第二个ContentManager,其中可以加载只使用一次的声音,然后再加载它。
要回答你的第二个问题,你错了:
ContentManager的每个实例只加载一次给定的资源。第二次请求资源时,它将返回与上次返回的实例相同的实例。 为此,ContentManager维护它在内部加载的所有内容的列表。此列表阻止垃圾收集器清除这些资源--即使您没有使用它们。
https://stackoverflow.com/questions/19726892
复制相似问题