我想要做的是使用内容管理器在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();
}
答案 0 :(得分:1)
如果您想要卸载单个声音,可以调用Dispose
方法,但重要的是您再也不需要它,否则您将获得一个处理元素的例外。
您可以创建第二个ContentManager
,您可以在其中加载仅使用一次的声音,然后加载Unload
。
要回答你的第二个问题,你错了:
ContentManager的每个实例只会加载任何给定的资源 一旦。第二次请求资源时,它将返回相同的内容 它上次返回的实例。
为此,ContentManager维护其拥有的所有内容的列表 内部加载。此列表可防止垃圾收集器 清理这些资源 - 即使您没有使用它们。