0

基本的に、ゲーム内で2つのアイテムが衝突したときに再生される効果音があります。一部のアイテムは非常に接近しているため、効果音をすばやく連続して再生する必要がある場合があります。

SoundEffect.Play()を使用すると、これは機能します。ただし、ガベージコレクションを節約するために、インスタンスを使用したいと思います。残念ながら、これは、最後のインスタンスの再生が終了するまでインスタンスが再生されないことを意味します。これは私が求めていた効果ではありません。この機能を上書きする方法はありますか、それとも昔ながらのSoundEffectに戻らなければなりませんか?

4

2 に答える 2

1

「ガベージコレクションを節約したい」理由はありますか?実際にパフォーマンスの問題が発生し始めない限り、心配する必要はほとんどありません。SoundEffect.Play()個人的な経験から、問題なく( を使用して) 少なくとも 12 のサウンドを連続して再生できます。ただし、ゲームに多くの衝突があると思われる場合は、次の 2 つの方法があります。

まず、SoundPlayer再生するすべてのサウンドを処理する単純なクラスを作成し、約 10 を超える同時再生を検出した場合は、次のサウンドが再生されないようにすることを検討してください。多くの衝突が発生している場合、プレーヤーが音の欠落に気付くようなものではありません。

次に、ここ ( http://forums.create.msdn.com/forums/t/91165.aspxDynamicSoundEffectInstance ) を参照して、サウンドをプレミックスする方法を確認してください。これはかなり複雑ですが、先を見越して、再生しようとしているすべてのサウンドを 1 つのバッファーにミキシングすることで、事実上 1 つのサウンド (または 1 つのオーディオ ストリーム バッファー) しか存在しないため、ラグがほぼゼロになることが保証されます。遊んでいます。

于 2012-03-11T16:29:20.113 に答える
0
List<SoundEffectInstance> explosionSoundInstanceList; 


        explosionSound = Content.Load<SoundEffect>("sound/explosion");

        explosionSoundInstanceList = new List<SoundEffectInstance>(MAX_EXPLOSIONS);

        for (int i = 0; i < MAX_EXPLOSIONS; i++)
        {
            explosionSoundInstanceList.Add(explosionSound.CreateInstance());
        }



 private void PlayExplosionSound(float volume, float pitch, float pan)
    {

        ClampSoundValues(ref volume, ref pitch, ref pan);

        for (int i = 0; i < explosionSoundInstanceList.Count; i++)
        {
            if (explosionSoundInstanceList[i].State == SoundState.Stopped)
            {
                explosionSoundInstanceList[i].Volume = volume / (i+1);
                explosionSoundInstanceList[i].Pitch = pitch;
                explosionSoundInstanceList[i].Pan = pan;
                explosionSoundInstanceList[i].Play();
                return;
            }

        }

        return;
    }

正常に動作します。インスタンス化後の 360 でのゼロ ガベージ。制限に達した後、エレガントに失敗します。

それが私が使っているものです。

このように値をクランプします

    private static void ClampSoundValues(ref float volume, ref float pitch, ref float pan)
    {
        volume = MathHelper.Clamp(volume, -1f, 1f);
        pitch = MathHelper.Clamp(pitch, -1f, 1f);
        pan = MathHelper.Clamp(pan, -1f, 1f);
    }

愚かな値を設定すると、例外がドロップされます。

于 2014-08-14T20:48:20.937 に答える