2

SoundPoolの使用中にパフォーマンスの問題が発生します。サウンドを再生するたびに、フレームレートが低下します。いくつかのログを追加しましたが、logcatで「再生」機能に8ミリ秒かかることがあります。

* .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);

私の質問は次のとおりです。

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

ありがとう!


アップデート:

別のスレッドでサウンドを再生し、サービスを介してサウンドを再生することをテストしましたが、ラグはまだ存在しています。

次に、次のテストを行いました。*1000ms間隔でサウンドを再生->ラグは常に発生します*200ms間隔でサウンドを再生->ラグは発生しません

そんなことがあるものか?!?!?これらのテストの後、何も再生されていないときはSoundPoolがリセットされ、再び再生されるときは初期化に時間がかかるようです...非常に奇妙です!

4

6 に答える 6

6

ミュートされたサウンドをループで再生することで問題を解決しました。

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

ラグは完全に消えました!

これは正しいことではないようですので、誰かがこれを説明する方法を知っているなら、私たちに知らせてください!

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

于 2011-09-19T15:53:15.430 に答える
1

OGGの代わりにMP3をロードしてみることができますが、一部の電話ではOGGがうまく機能しないことがわかりました。

于 2012-01-10T16:19:11.063 に答える
1

描画ループとゲームループが別々にあり、サウンドプールプレイと呼ぶと、描画ループに多少の遅れが生じます。いつもではありませんが、それは私のアプリが遅れているように見えます。

私はwavとoggの両方を試しましたが、あまり違いはないようです。Wavの方が少し優れていますが、別の問題が発生します。soundpoolは、1回だけ呼び出すとwavファイルを2回再生することがあるため、oggに切り替えました。

私の現在の解決策は、新しいランナブルからplayを次のように呼び出すことです。

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);
        }
}

そして、私のゲームループから、私は電話します

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

私はこの方法ではるかに少ないラグを経験しますが、それは正しい/最良の解決策ではないと確信しています。

于 2012-03-07T09:47:04.453 に答える
0

ゲームループの外で、別のスレッドで「プレイ」と呼ぶ必要がありますか?

サービスを通じて「プレイ」と呼ぶべきですか?

私は両方を試しましたが、どちらも同じパフォーマンスの向上をもたらすようでした。どちらも、アプリケーション内で気付いた目に見えるラグを修正しました。ですから、そうすることを選択してください。そうすれば、パフォーマンスに役立つはずです。

于 2011-09-15T23:33:32.227 に答える
0

バックグラウンドで無音をループするthiagolrのテクニックに似たものを実装しました。問題を「修正」する正しい方法ではないように思われることに同意しますが、機能します。MediaPlayerを使用して背景の「サウンド」をループしました。これは、SoundPoolからのストリームを使用すると、実際のサウンドエフェクトを再生するために再利用されることがあり、問題が再発したためです。

私が助けたと思うもう一つのことは、私のすべてのオーディオを16ビット22Koggに変換することでした。

バックグラウンドでのループの沈黙の最大の欠点は、バッテリーの小さなヒットだと思いますが、効果音を再生することは価値があるようです。これは、ジンジャーブレッド以下を使用しているデバイスでのみ行います。Kindle Fireでうまく機能し、NookTabletでも十分に機能すると思います。私のアプリはすでにNookColorで少し遅い側にありますが、これがそれをさらに悪化させたとは思いません。最近の1つでは、OpenGLを使用するために、描画コードを完全に変換する必要があります。

于 2012-06-06T19:03:49.907 に答える
0

OGGはすべてのプラットフォームに提供されていますが、それらのプラットフォームはそれをサポートしていない可能性があるため、MP3はほとんど最善の策です。

于 2013-10-08T00:27:45.330 に答える