首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >适当结束SoundEffectInstance

适当结束SoundEffectInstance
EN

Stack Overflow用户
提问于 2013-11-01 12:35:39
回答 1查看 290关注 0票数 1

我想做的是使用Content在XNA中Load()一个声音效果,并自动创建一个实例来控制回放。当声音不再需要时,我想知道如何正确地从内存中Unload()它?

此外,我还想知道是否需要Unload()。当我两次调用Load()时,第二个调用是否正确地释放了第一个调用的内存?我猜想C#垃圾收集器在被第二个调用覆盖时会自动处理旧的效果和实例。这是正确的吗?

这些是我的自定义MySoundEffect类中的参数:

代码语言:javascript
复制
// Has sound effect been loaded?
bool loaded;

// Store our SoundEffect resource
SoundEffect effect;

// Instance of our SoundEffect to control playback
SoundEffectInstance instance;

此方法正在加载声音。

代码语言:javascript
复制
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();
}

这是在不再需要声音时调用的:

代码语言:javascript
复制
public void Unload()
{
    loaded = false;

    instance.Dispose();

    effect.Dispose();
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-02 01:23:23

如果您想卸载单个声音,您可以调用Dispose方法,但重要的是再也不需要它了,否则您将收到异常的已处理元素。

您可以创建第二个ContentManager,其中可以加载只使用一次的声音,然后再加载它。

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

ContentManager的每个实例只加载一次给定的资源。第二次请求资源时,它将返回与上次返回的实例相同的实例。 为此,ContentManager维护它在内部加载的所有内容的列表。此列表阻止垃圾收集器清除这些资源--即使您没有使用它们。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19726892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档