0

1 つのユニットに 3 つのオーディオ ステージがある Android ゲームを作成します。

  • 打撃を受けます
  • 攻撃

そこで、Unit オブジェクトに次のコードを追加しました。

    MediaPlayer mMediaPlayerGetHit = null;
    MediaPlayer mMediaPlayerDead = null;
    MediaPlayer mMediaPlayerAttack = null;

constructor

  mMediaPlayerAttack=MediaPlayer.create(context,R.raw.fly_monster_attack1);
  mMediaPlayerDead=MediaPlayer.create(context,R.raw.fly_monster_death1);
  mMediaPlayerGetHit=MediaPlayer.create(context,R.raw.fly_monster_gethit1);

  mMediaPlayerAttack.setOnPreparedListener(this);
  mMediaPlayerDead.setOnPreparedListener(this);
  mMediaPlayerGetHit.setOnPreparedListener(this);

  ....

今は雑然としていますが、

うーん、ユニット状態ごとに 1 つずつ、3 つのプレイヤー オブジェクトです。

私はその方法が間違っていると確信しておりMediaPlayer、ユニットの状態に関して毎回ソースを変更する必要があります。

しかし、ここにパフォーマンスの問題があります:

MediaPlayerがソースを取ったとしましょうattack

その後、 に切り替えget hit、もう一度に切り替えattackます。

たぶん、どういうわけかMediaPlayerwithのインスタンスを保存して再利用する必要がありますか?attack

何百回も私の貧しい人を切り替える良い方法だとは思いませんMediaPlayer

何か案は?

ありがとうございました、

4

2 に答える 2

4

SoundPool クラスを見てください。あなたがやろうとしていることにより適していると思います。使用方法の良い例を次に示します。

http://www.edumobile.org/android/android-programming-tutorials/sound-pool-example-in-android-development/

SoundPool はゲームに最適です。私はそれを私の中で使用しましたが、完璧に動作します。このクラスを使用すると、アクションごとに 1 つの MediaPlayer を作成することなく、複数のサウンドを同時に簡単にループ、再生、および停止できます。心配する必要があるのは、使い終わったらプールを解放します。また、あなたが何をしているかに応じて、非常に効率的な優先度システムがあり、再生するサウンドの最大量を設定し、優先度に基づいて別のサウンドを再生し続け、新しいサウンドを挿入するときに別のサウンドのリソースを取得できます...

ドキュメンテーション:

優先度は低いものから高いものへと変化します。つまり、数字が大きいほど優先度が高くなります。優先順位は、play() の呼び出しによってアクティブなストリームの数が、SoundPool の作成時に maxStreams パラメータによって設定された値を超える場合に使用されます。この場合、ストリーム アロケータは最も優先度の低いストリームを停止します。同じ優先度の低いストリームが複数ある場合は、最も古いストリームを選択して停止します。新しいストリームの優先度がすべてのアクティブなストリームよりも低い場合、新しいサウンドは再生されず、play() 関数はゼロのストリーム ID を返します。

よろしく!

于 2013-07-11T18:55:30.603 に答える
4

このような短いサウンドバイトの場合は、MediaPlayer の代わりにSoundPoolを使用することを実際に検討する必要がありますが、MP を使用してオーディオをデコードします..低遅延ストリーム用に設計されており、同時に複数のストリームを許可します.

低遅延の再生に加えて、SoundPool は一度にレンダリングされるオーディオ ストリームの数も管理できます。SoundPool オブジェクトが構築されるとき、maxStreams パラメータは、この単一の SoundPool から一度に再生できるストリームの最大数を設定します。SoundPool は、アクティブなストリームの数を追跡します。ストリームの最大数を超えると、SoundPool は、優先度に基づいて、次にその優先度内の経過時間に基づいて、以前に再生していたストリームを自動的に停止します。ストリームの最大数を制限することで、CPU の負荷を抑え、オーディオ ミキシングがビジュアルや UI パフォーマンスに影響を与える可能性を減らすことができます。

したがって、複数のサウンドを一度にレンダリングする必要があるゲームのようなものでは、SoundPool が理想的かもしれません。

于 2013-07-11T18:55:39.390 に答える