私は、3つの関数(initSound、addSound、およびplaySound)で構成されるSound.javaというクラスを持っています。SoundPoolのアプリケーションの減速
public static void initSound(Context con) {
mContext = con;
soundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 0);
soundPoolMap = new HashMap<Integer, Integer>();
audioManager = (AudioManager)mContext.getSystemService(Context.AUDIO_SERVICE);
streamVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
streamVolume = streamVolume/audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
}
public static void addSound(int index, int SoundID) {
soundPoolMap.put(index, soundPool.load(mContext, SoundID, 1));
}
public static void playSound(int index) {
soundPool.play(soundPoolMap.get(index), streamVolume, streamVolume, 1, 0, 1f);
}
私は、MainGame.javaコンストラクタでinitSoundとaddSoundを呼び出しました。
Sound.initSound(getContext());
Sound.addSound(1, R.raw.machine_gun);
MainGame.javaのスレッド(ルーピング)内でplaySoundと呼ばれます。イベントがトリガされたときに毎秒呼び出されるPlaySound(例えば、敵が見えているとき、敵が死んでしまうまで、兵士(複数)が連続して撃つ(音を鳴らす))。
Sound.playSound(1);
問題は、サウンドが再生され、アプリケーションが減速しているときです。 私は音響効果について知っている限り、soundpoolはmediaplayerよりも優れているので、私はsoundpoolを使用しています。 (私はメディアプレイヤーを試しましたが、ラグはもっとです)
私が使用するサウンドファイルは、サイズが5.44KBの.wav(符号なし8bit PCM、1チャンネル、8000hz)です。
ゲームのパフォーマンスを低下させることなく効果音を再生するには良い方法がありますか、それとも間違っていますか?私は本当にどんな考えや反応にも感謝しています。
実際のデバイスではまだエミュレータで試していません。さて、私は16ビットpcmにデコードし、すぐに結果を投稿しようとします。 thx – flowoverstack
そして、私は、あなたが特に遅いマシンを持っている場合に特に起こるperf問題を見ることができました。それはちょっとしたことです。現実的には、これは大きな問題ではありません。私が言ったように、私は基本的に同じコードを使用しました。私が見ている唯一の違いは、1の代わりに優先度0を使用していることです(これは私が助けてくれると思います).HashMapを使用してIDを格納しませんでした(ちょっとCPU時間を節約すると思いますが、私はこれが問題であるとは思わない)。 – kabuko
こんにちは、私は16bit PCMを試しましたが、まだperfを遅くします。私は優先度を0に設定していますが、perfをわずかに改善しますが、十分ではないと思います。私はneroWaveEditor(オリジナルの長さ00:00:00:690から00:00:00:220まで)で16ビットPCM wavサウンドファイルをカットし、サウンドを使用しない場合よりもパフォーマンスは向上しますが、 IDはCPU時間を1回だけ増やします(追加と初期化時)?私は実際のデバイスに問題があるので、マシンが遅いと言っているようですが、実際のデバイスでは試していません。あなたの応答:D – flowoverstack