2011-09-15 23 views
2

SoundPoolの使用中にパフォーマンスの問題が発生しています。サウンドを再生するたびに、フレームレートが低下します。私はいくつかのログを追加し、私はlogcatで "再生"機能が8msかかることがあることがわかります。ゲームでSoundPoolを正しく使うには?

私は* .OGGファイルを使用していますし、SoundPoolの初期化は、アプリの起動時に行われます。

:サウンドを再生するには

mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 
mSoundPool = new SoundPool(size, AudioManager.STREAM_MUSIC, 0); 
mSoundPoolMap = new HashMap<Integer, Integer>(); 
mSoundPoolMap.put(index, mSoundPool.load(context, R.raw.shot, 1)); 

、私は(ゲームループの内側)に次のコードを使用します

mSoundPool.play(id, streamVolume, streamVolume, 1, loop, 1f); 

私の質問は以下のとおりです。

  • 私はゲームループの外に、別のスレッドの「遊び」と呼ぶべきでしょうか?
  • サービスを通じて「再生」する必要がありますか?
  • 何か間違っていますか?

ありがとう!


UPDATE:私はちょうど別のスレッドでサウンドを再生し、サービスを介して音を再生するテストしますが、タイムラグがまだ存在する

は、それから私は、次のテストをしました: * 1000ミリ秒間隔で音を再生する - >ラグは常に200ミリ秒間隔で音を再生* を起こる - >ラグは決して

起こりませんどうということは可能ですか?!? !? これらのテストの後、何も再生されていないとき、SoundPoolがリセットされていて、再生を再開すると、初期化に時間がかかるようです...非常に奇妙です!

答えて

5

私は、ループ内のミュート音を再生することで、問題を解決:

mSoundPool.play(id, 0, 0, 1, -1, 1f); 

をラグが完全に消えました!

これは正しいことではありません。だからこそ説明する方法が分かっている場合は、教えてください。

詳細: http://www.thiagorosa.com.br/en/how-to/improve-soundpool-performance

+0

奇妙ですが、これはうまくいきます。ありがとう! –

+0

これはどのようにバッテリ寿命に影響しますか? – Phil

+0

特定の周波数で音を鳴らすときに同様の遅れの問題があります。しかし、私は解決策を得られません。それがミュートされている場合、なぜあなたはプレイする必要がありますか?他の音も聞こえませんでした。 –

0

ゲームループ外の別のスレッドで「再生」する必要がありますか?

サービスを通じて「再生」する必要がありますか?

私は両方を試してみたところ、どちらも同じパフォーマンス向上をもたらしたようでした。両方とも私のアプリケーション内で気づいた目に見える遅れを修正しました。だから私はそうする人のうちの1人を選ぶと言うでしょう。それはあなたのパフォーマンスを助けるはずです。

+0

私は両方の方法を試したところ、パフォーマンスが向上していませんでした。私はhttp://stackoverflow.com/questions/5580537/androidsound-pool-and-serviceのサービスアイデアを使用し、自分でそれを行ったスレッドソリューションを使用しました。 – thiagolr

1

あなたは、MP3ファイルの代わりに、OGGsをロードしようとすることができ、私はいくつかの携帯電話でOGGsがちょうどうまく再生されないことがわかりました。

+3

私は実際に反対を言うだろう。 – Ricky

1

私は別々の描画ループとゲームループを持っています。私がサウンドプールを呼び出すと、私の描画ループの経験はいくらか遅れます。必ずしもそうではありませんが、アプリが遅れているようです。

私はwavファイルやoggの両方を試してみたが、大きな違いがあるようだdoes notの。 Wavはもう少し良いですが、別の問題が発生します。一度呼び出すと、soundpoolはwavファイルを2回再生することがあるので、私はoggに切り替えました。

私の現在のソリューションは、新しい実行可能でプレーを呼び出すことです:私のゲームループから、私はこのようにあまり遅れを経験するが、私

Runnable r = new MyRunnable(sound_id); 
handler.postDelayed(r, 0); 

を呼び出し、その後

public class MyRunnable implements Runnable { 
     private int s_id; 
     public MyRunnable(int sound_id) { 
      s_id = sound_id; 
     } 
     public void run() { 
      SoundManager.playSound(s_id, 1); 
     } 
} 

とそれが正しい/最良の解決策ではないと確信しています。

0

私は、バックグラウンドで沈黙をループのthiagolrの手法に似た何かを実装しました。私はそれが問題を "修正"する正しい方法のようには見えないと同意する - しかしそれはうまくいく。 SoundPoolからのストリームを使用すると、時には実際のサウンドエフェクトを再生するために再利用され、問題が戻ってきたので、バックグラウンドの「サウンド」をループするためにMediaPlayerを使用しました。私が助けたと思い

もう一つは、16ビットの22KのOGGに私のオーディオのすべてを変換しました。

バックグラウンドでの無音ループの最大の欠点は、バッテリーの消費量が少ないことですが、想定されるときに効果音を発する価値があるようです。私はジンジャーブレッド以下を使用するデバイスでのみこれを行います。それはKindle Fireですごくうまく機能し、Nook Tabletで十分にうまくいくと思います。私のアプリはすでにNook Colorのほうが少し遅いですが、これが悪いとは思えません。最近、OpenGLを使用するために、私の描画コードを完全に変換する必要があります。 OGGは、すべてのプラットフォームのために設けられているが、これらのプラットフォームがそれをサポートしていない可能性があるため

0

MP3はかなりあなたの最善の策です。

関連する問題