SoundPool 减慢应用程序
Posted
技术标签:
【中文标题】SoundPool 减慢应用程序【英文标题】:SoundPool slowing down app 【发布时间】:2011-06-17 20:41:47 【问题描述】:我有一个名为 Sound.java 的类,它由 3 个函数(initSound、addSound 和 playSound)组成。
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 是因为据我所知的音效,soundpool 比 mediaplayer 更好。 (我已经尝试过媒体播放器,但延迟更大。)
我使用的声音文件是 .wav(无符号 8 位 PCM,1 通道,8000hz),大小为 5.44KB。
有没有更好的方法来播放效果声音而不会降低游戏性能,还是我的错误?我非常感谢任何想法和回应。
【问题讨论】:
【参考方案1】:根据SoundPool docs,它解码为 16 位 PCM,因此您可以更改为 16 位 PCM,看看是否能从中获得一些性能。除此之外,您的代码似乎与我以前做过的事情非常相似(至少据我所知),而且我没有看到任何重大的性能问题(我相信我什至没有使用 WAV,我只是使用OGG,但我不记得了)。您是在实际设备上尝试,还是仅在模拟器上尝试?
【讨论】:
我还没有在实际设备上尝试过,只是在模拟器上。好的,我将尝试解码为 16 位 pcm 并立即发布结果。谢谢 然后我可以看到性能问题正在发生,特别是如果你有一台特别慢的机器。这只是更多的事情发生。实际上,虽然这应该不是一个大问题。就像我说的,我使用了基本相同的代码。我看到的唯一区别是我使用了优先级 0 而不是 1(我想这会有所帮助)并且我没有使用 HashMap 来存储 ID(我想这会占用一点 CPU 时间,但在一秒钟内查找一次,我看不出这是个问题)。 嗨,我试过 16 位 PCM,但它仍然会减慢性能。我将优先级设置为 0,它确实使性能稍微好一些,但我认为这还不够。我用 neroWaveEditor 剪切了 16 位 PCM wav 声音文件(从原始长度 00:00:00:690 到 00:00:00:220),我得到了更好的性能,但仍然比不使用声音要慢:( 以及关于要存储的哈希图id 只占用 CPU 时间一次(当 add&init 时)对吧?我想就像你说的机器很慢,我没有在实际设备上尝试过,因为我的实际设备有问题。谢谢你的回应:D【参考方案2】:我遇到了同样的问题。然后我为声音池创建了一个新线程,并在 while 循环中添加了 20 毫秒的睡眠时间。问题消失了。
【讨论】:
以上是关于SoundPool 减慢应用程序的主要内容,如果未能解决你的问题,请参考以下文章