1

WP7は、再生されるサウンドが多すぎると、かなり厳しいパフォーマンスペナルティを受けます。SoundEffectInstancesを追跡し、一度に多くの人が再生するのを防ぐAudioManagerがあります。

ただし、インスタンスを必要とせず、SoundEffect自体でPlay()を呼び出すだけのものもあります。たとえば、弾丸が何かに当たったときに衝撃音を鳴らしますが、実際にはインスタンスは必要ありません。

私の現在のシステムはインスタンスのみを管理しています。私がやりたいのは、使用されていないそのSoundEffectの既存のインスタンスがあるかどうかを確認し、単にそれを再生することです。これには、SoundEffectInstanceのSoundEffectタイプを見つけて、再生されているかどうかを確認し、再生されていない場合は再生する必要があります。これを行うことで、再生音全体をより正確に追跡できるようになります。

うまくいけば、それは理にかなっており、誰かが私を正しい方向に向けることができます。

4

1 に答える 1

0

SoundEffectInstances決定する重要なことは、一度にプレイする回数をどのように管理するかです。明らかな方法は、ゲームプレイコード(またはレベルなど)を変更して、再生するサウンドの数が増えすぎないようにすることです。

ただし、これが受け入れられない場合は、何らかの方法でハード制限を適用する必要があります。そして問題は、どうやってそれをするのかということです。各効果音には、その効果音のインスタンスの最大数がありますか?それとも、「サウンドクラス」(クラスの再生回数が最大になるクラス)はありますか?それとも、グローバルな最大サウンドカウントですか?追加のサウンドが再生されないようにすることで、上限が適用されますか?または、すでに再生されている音をカットすることによって?

私が提案するのはSoundEffect、それとほぼ同じことを実装するラッパーオブジェクトを作成することですSoundEffect.Play(sのプールを内部的に管理し、SoundEffectInstance再生が終了したときにそれらを再利用します)。次に、その上に再生キャップ機能を追加します。

したがって、ラッパークラスは次のようになります。

class MySoundEffect
{
    SoundEffect sound;
    List<SoundEffectInstance> instances;
    int maxInstances;
}

またはおそらくこのように:

class MySoundEffect
{
    static int[] soundClassMaximums = { 2, 2, 5, 10 };
    static int[] soundClassInstanceCount;

    SoundEffect sound;
    List<SoundEffectInstance> instances;
    int class;
}

そして、MySoundEffect通常使用しているすべての場所で使用しSoundEffectます。

ExEnを見てください。の内部を実装しているためSoundEffect、実際のXNAと同様のプーリングコードを借用して、SoundEffect機能を追加した独自のインスタンスプールの開始点として使用できます。

それを行うには他の方法があり、それはあなたのアーキテクチャに依存します。しかし、基本的には、効果音とインスタンスの間の関連付けを追跡するのはあなた次第です。XNA APIでそれを行う方法はありません(厄介なリフレクションを行う以外に)。

于 2011-06-27T09:49:01.160 に答える