这个可能很具体,还在试问:
我是 Android 软件音乐合成器 Heat Synthesizer 的创始人。 (https://play.google.com/store/apps/details?id=com.nilsschneider.heat.demo)
这个应用程序实时生成音频信号,需要进行大量的数学计算才能做到这一点。
看到 Google I/O 2013 关于“Android 上的高性能音频”(http://www.youtube.com/watch?v=d3kfEeMZ65c) 的演讲后,我很高兴按照他们的建议实现它,但我一直遇到噼啪作响的问题。
我在 Nexus 7(2012 年)上的单核 CPU 使用率约为 50%,到目前为止一切似乎都还好。锁定已减少到最低限度,并且大部分代码都是无锁完成的。
使用一个名为 Usemon 的应用程序,我可以看到我用于处理的内核仅使用了 50%,甚至由于我的 CPU 使用率不够高而被内核降频。
但是,这种核心速度变化会导致音频噼啪作响,因为下一个音频 block 的计算速度不够快,因为我的核心是欠频的。
有什么办法可以防止内核改变它的时钟频率?
最佳答案
FWIW,我建议使用 systrace(docs、explanation、example)进行此类分析。在 Root设备上,您可以启用“频率”标签,它显示各种组件的时钟频率。在 Android 4.3 及更高版本上效果最佳。
处理这个问题的电池不友好的方法是启动第二个线程,在计算过程中除了旋转之外什么都不做。理论上这不应该工作(因为你在不同的核心上旋转),但实际上它通常可以完成工作。确保验证设备具有多个内核(Runtime.getRuntime().availableProcessors()
或 NDK 等效项),因为在单核设备上执行此操作会很糟糕。
假设您的计算是在单独的线程中异步执行的,您可以通过将工作线程从“计算,然后等待工作”更改为“计算,然后轮询工作”模型来做得更好。同样,电池效率要低得多,但是如果您从不 sleep ,那么内核将假定您正在努力工作并且需要使内核保持全速运行。如果没有任何实际工作要做(即您输入结束),请确保退出轮询模式。
关于android - 高性能音频破解/防止 CPU 内核降频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20229196/