【发布时间】:2012-04-15 21:39:53
【问题描述】:
我正在编写一个使用录制样本(使用 SoundPool)播放音乐的 Android 应用程序。我有一个播放器,可以根据当前时间(realTimeElapsed)检查我必须播放哪些样本。播放器使用我设置为 1 毫秒的计时器进行更新。大多数时候这工作正常,但有时我有大约 100 毫秒的延迟。
我找不到增加计时器优先级的方法,有没有其他方法可以解决这些延迟?
我同时使用 openGL 渲染场景,但如果我禁用所有绘图,我会得到相同的延迟。
谢谢
编辑:
我使用 TraceView 对其进行了分析:音频线程 (Thread-16) 每毫秒执行一次。但是在 t=2580 时有大约 200 毫秒的中断。在此期间线程没有处于睡眠状态,而是在 SoundPool.play 方法中并被中断。每次我有这样的延迟时,音频线程都会被中断。没有办法防止这些中断吗?
我已将 GL 线程(中断音频线程)的优先级设置为 THREAD_PRIORITY_LOWEST。
右键单击图像并选择“显示图像”或类似的选项以全分辨率查看图像。
【问题讨论】:
-
200 毫秒听起来有点大。是否有可能是由于垃圾收集造成的?发生垃圾回收时,会向 logcat 打印一条消息。只需确保它是来自您的进程的消息,而不是其他随机进程。
-
此时没有GC运行,你会在TraceView中看到GC。在这 200 毫秒内,OpenGL 线程一直在运行(请右键单击图像并选择“显示图像”或附近的选项以全分辨率查看图像)
-
肯定是Soundpool的问题,如果我不调用SoundPool的play方法,我一点延迟都没有。我将不得不为这个问题打开一个新线程