【问题标题】:SoundPool play()... better in a thread or in main UI thread?SoundPool play()... 在线程或主 UI 线程中更好?
【发布时间】:2019-10-17 07:48:47
【问题描述】:

我注意到,在线程中播放带有 soundpool 的 SFX 时,它会在游戏中产生 FPS 减慢,而在主线程中播放 SFX 时,游戏不会减慢。

为什么 soundpool 从主线程播放效果更好?

这是播放调用:

streamID[sound] = soundPool.play(soundID[sound], getSoundEffectsVolume(), getSoundEffectsVolume(), 0, loop, 1);

【问题讨论】:

  • 我们怎么知道不是你线程的实现,或者线程间的通信方案?
  • @greeble31 我的线程没有做任何特别的事情,每 33 ms 的周期只占用 1 或 2 ms 的 CPU,所以它等待 31 ms,线程通信方案是 android 默认方案,我没有做任何特别的事情
  • 不确定“默认方案”是什么意思;如果您可以发布更多代码,或者准确解释您调用什么方法来传递消息,那将会很有帮助。另外,1.) 你如何确定 FPS 减速,2.) 减速的程度是多少,3.) 假设你使用 GLSurfaceView,你的 onDrawFrame() 平均执行大概需要多长时间?跨度>

标签: android multithreading soundpool android-sound


【解决方案1】:

因为SoundPool是一匹黑马,它在native layer中实现。因此,每次您致电 SoundPool.play() 时,您都会在内部创建新线程。
因此,当您直接在 UI 线程中调用 play 时,您将获得:1 个主线程 + 1 个 AudioTrack 线程(在 play 调用中创建)。当您在工作线程中调用 play 时,您将获得:1 个主线程 + 1 个工作线程 + 1 个播放线程。更多线程 == 剩余资源更少。

此外,当您在 ui 线程中调用 play 时,您将获得更低的延迟。因为只会有一个切换:从 ui 到 audioTrack 线程,而不是两个:从 main 到 worker,从 worker 到 audiotrack 线程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-01
    • 2013-05-05
    • 2012-07-21
    • 1970-01-01
    • 2017-04-08
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    相关资源
    最近更新 更多