我的 openGL 音频可视化器落后于音乐时遇到问题。我最近改用多线程方法。在三星 S3 上一切正常,但在 HTC Evo 上,音频可视化器落后于音乐。
从音频输入到可视化的管道中有四个线程,AudioIn -> AudioProc -> UI -> openGL。我认为问题可能出在 openGL 上,但我在将新消息添加到 requestRender() 方法之前开始清除消息队列。没有帮助。
我认为问题出在 AudioIn 到 AudioProc 之间,即 AudioProc 花费的时间太长并且正在建立 que。我不断获得 GC_CONCURRENT ~43ms 的 Logcats。在 60Hz 下大约是 2 或 3 帧。DDMS 中的分配跟踪器建议在 AudioProc 线程上进行许多分配。所以我删除了分配并用我的 DSP 类中的私有 float[] 对象替换它们。
但是随后分配开始显示对“java 反射数组”的一些调用,并且 GC_CONCURRENT 调用变得更长了。我认为这可能是因为我在 UI 线程中声明了 DSP 类 ref 对象,并且在我的 AudioProc 线程中使用它,所以我更改了代码以在我的 AudioProc 线程中调用分配 mDSP,但现在 logcat 显示“JIT unchain all”对 AudioProc 线程的调用和 700+ms 的 GC_CONCURRENT 时间。
显然我错过了一些基本的东西,请推测。我可以发布代码。