如何在游戏中正确使用SoundPool?

时间:2011-09-15 21:12:39

标签: android soundpool

使用SoundPool时遇到性能问题。每次播放声音时,帧速率都会下降。我添加了一些日志,我可以在logcat上看到“播放”功能有时需要8ms。

我正在使用* .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);

我的问题是:

  • 我应该在游戏循环之外的另一个线程上调用“play”吗?
  • 我应该通过服务叫“玩”吗?
  • 我做错了吗?

谢谢!


更新:

我刚测试过在另一个线程上播放声音并通过服务播放声音,但滞后仍然存在。

然后我做了以下测试: *以1000毫秒的间隔播放声音 - &gt;滞后总是发生 *以200ms的间隔播放声音 - &gt;从来没有发生过滞后

怎么可能?!?!? 经过这些测试后,似乎没有播放时,SoundPool正在重置,当它再次播放时,初始化需要更长时间......非常奇怪!

6 个答案:

答案 0 :(得分:5)

我通过循环播放静音来解决问题:

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

滞后完全消失了!

这似乎不太合适,所以如果有人知道如何解释,请告诉我们!

更多信息: http://www.thiagorosa.com.br/en/how-to/improve-soundpool-performance

答案 1 :(得分:1)

你可以尝试加载MP3而不是OGG,我发现在某些手机上OGG只是玩得不好。

答案 2 :(得分:1)

我有一个单独的绘图和游戏循环,当我调用声音池播放时,我的绘图循环经历了一些滞后。并非总是如此,但它使我的应用程序看起来很迟钝。

我已经尝试了wav和ogg,但似乎没有太大的区别。 Wav好一点,但它引起了另一个问题,当他们只调用一次时,soundpool有时会播放两次wav文件,所以我切换到ogg。

我目前的解决方案是从新的runnable调用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);

我以这种方式经历了更少的延迟,但我确信这不是正确/最佳的解决方案。

答案 3 :(得分:0)

  

我应该在游戏循环之外的另一个线程上调用“play”吗?

     

我应该通过服务叫“玩”吗?

我已经尝试了两者,他们似乎都提供了相同的性能提升。两者都确实修复了我在应用程序中注意到的可见延迟。所以我会说是选择其中一个做,这应该有助于你的表现。

答案 4 :(得分:0)

我刚刚实现了类似于thiagolr在后台循环静音的技术。我同意这似乎不是解决问题的正确方法 - 但它确实有效。我使用MediaPlayer循环播放背景“声音”,因为如果我使用SoundPool中的一个流,它有时会被重用来播放实际的声音效果,问题又回来了。

我认为另一件事就是将我的所有音频转换为16位22K ogg。

我认为在背景中循环静音的最大缺点是电池电量很小,但是当它们应该播放音效时似乎是值得的。我只在使用Gingerbread或更低版本的设备上执行此操作。它在Kindle Fire上运行得非常好,而且我认为Nook平板电脑非常好。我的应用程序已经在Nook Color上有点慢,但我不认为这会让它变得更糟。有一天我需要完全转换我的绘图代码以使用OpenGL。

答案 5 :(得分:0)

MP3几乎是你最好的选择,因为虽然OGG是为所有平台提供的,但这些平台可能不支持它。