【问题标题】:Properly end SoundEffectInstance正确结束 SoundEffectInstance
【发布时间】:2013-11-01 12:35:39
【问题描述】:

我想做的是使用内容管理器在 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();
}

【问题讨论】:

    标签: c# .net audio xna xna-4.0


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 所以当我覆盖所有对使用 ContentManager 加载的资产的引用时,垃圾收集器仍然没有处理它吗?这不会完全破坏 GC 的意义吗?
    • 我认为您需要调用 Content.Unload() 手动卸载它们。
    • this 是否与此相矛盾?
    • 我引用了this 的答案。我信任拥有 19k 代表点的用户。
    • 如果你再看一遍这个问题,你会发现答案已经改变了,正如我告诉你的那样。
    猜你喜欢
    • 1970-01-01
    • 2015-01-02
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    • 2013-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多