提问人:Selçuk Özer 提问时间:10/18/2022 最后编辑:Selçuk Özer 更新时间:10/20/2022 访问量:36
Soundpool 无法播放最大流数
Soundpool doesn't play maximum number of streams
问:
我在我正在开发的游戏中使用声音池。它大部分时间都在弹奏钢琴音符,同时弹奏多个音符。在某些手机上,音符播放得非常好。另一方面,当我在另一部手机上进行测试时,有些音符无法播放。为了调查该问题,我编写了以下代码来了解问题的根源。有 85 个音符按顺序播放。当音符之间的延迟约为 1 秒时,音符播放良好,没有任何跳跃或延迟。这显示所有样本都加载完毕,没有任何错误。但是当我将延迟减少到 100 毫秒时,音符开始重叠,并且在以适当的方式依次播放几个音符后,声池停止并等待样本完成,然后再播放剩余的音符。另一方面,在另一部手机上,即使延迟为 100 毫秒,所有音符也能正常播放。由于最大流数为 100,因此即使同时播放,声池也应播放所有音符。我还在运行以下代码时检查了内存,没有任何过载。
我已经研究这个问题几天了,所以如果你帮助我,我将不胜感激。
spl=new SoundPool(100, AudioManager.STREAM_MUSIC, 0));
Handler handler = new Handler();
Runnable runnable = new Runnable() {
int cnt1=0,cnt2=0;
@Override
public void run() {
cnt1=cnt1+1;
if (cnt1>10){
stream=spl.play(sndIds[cnt2],volumesToBePlayed.get(i), volumesToBePlayed.get(i),1,0,1f);
Log.i("playing", String.valueOf(cnt2) + " " + String.valueOf(stream));
cnt1=0;
cnt2=cnt2+1;
}
if(cnt2>= sndIds.lenght){
handler.removeCallbacks(this);
} else {
handler.postDelayed(this, 100);
}
}
};
runnable.run();
编辑:在对问题进行了更多调查后,我注意到有些手机能够比其他手机同时播放更多的样本。在像我这样的钢琴应用程序中,如果有许多同时或重叠的演奏动作,我认为,使最大流数变大不是一个好主意,因为当达到最大容量时,声池会跳过演奏的音符。当最大值低于手机容量时,soundpool 不会跳过新声音,而是先停止已播放和最旧的流(如果它们的优先级相同)。这听起来对用户来说不那么令人不安。我通过将最大流数减少到 12 来解决这个问题。
答: 暂无答案
下一个:是否需要使用原子或其他同步
评论