1

私がやりたいことはLoad()、Content Manager を使用して XNA で効果音を作成し、再生を制御するインスタンスを自動的に作成することです。サウンドが不要になったとき、Unload()メモリから適切にするにはどうすればよいか考えていました。

さらに、必要なのかどうか疑問に思っていUnload()ました。2 回呼び出すとLoad()、2 回目の呼び出しで最初の呼び出しのメモリが適切に解放されますか? C# のガベージ コレクターは、古いエフェクトとインスタンスが 2 回目の呼び出しで上書きされるため、それらを自動的に破棄すると思います。これは正しいです?

これらは、私のカスタム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();
}
4

1 に答える 1

1

単一のサウンドをアンロードする場合はDispose、メソッドを呼び出すことができますが、二度と必要としないことが重要です。そうしないと、破棄された要素の例外が発生します。一度だけ使用するサウンドをロードできる
秒を作成し、次にそれを作成できます。ContentManagerUnload

2 番目の質問に答えるには、あなたは間違っています。

ContentManager の各インスタンスは、特定のリソースを一度だけロードします。2 回目にリソースを要求すると、前回返されたのと同じインスタンスが返されます。

これを行うために、ContentManager は内部的にロードしたすべてのコンテンツのリストを維持します。このリストは、ガベージ コレクターがそれらのリソースをクリーンアップするのを防ぎます (それらを使用していない場合でも)。

于 2013-11-02T01:23:23.293 に答える