C# 正确结束SoundEffectInstance
我想做的是使用Content Manager在XNA中加载一个声音效果,并自动创建一个实例来控制播放。当声音不再需要时,我想知道如何正确地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
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();
}