android - 高性能音频破解/防止 CPU 内核降频

标签 android audio android-ndk

这个可能很具体,还在试问:

我是 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(docsexplanationexample)进行此类分析。在 Root设备上,您可以启用“频率”标签,它显示各种组件的时钟频率。在 Android 4.3 及更高版本上效果最佳。

处理这个问题的电池不友好的方法是启动第二个线程,在计算过程中除了旋转之外什么都不做。理论上这不应该工作(因为你在不同的核心上旋转),但实际上它通常可以完成工作。确保验证设备具有多个内核(Runtime.getRuntime().availableProcessors() 或 NDK 等效项),因为在单核设备上执行此操作会很糟糕。

假设您的计算是在单独的线程中异步执行的,您可以通过将工作线程从“计算,然后等待工作”更改为“计算,然后轮询工作”模型来做得更好。同样,电池效率要低得多,但是如果您从不 sleep ,那么内核将假定您正在努力工作并且需要使内核保持全速运行。如果没有任何实际工作要做(即您输入结束),请确保退出轮询模式。

关于android - 高性能音频破解/防止 CPU 内核降频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20229196/

相关文章:

android - 从 FireBase 获取 JsonArray

android - Webview 上的 Html5 视频在 Lollipop 上缺少全屏按钮

android - 如何在应用崩溃时保存录音?

Javascript:无法播放wav文件

jenkins - 如何在Linux上的jenkins中设置android ndk

android - 无法加载游戏 : findLibrary returned null: with cocos2d-x, 尽管尝试了很多次仍未成功?

android - 使用 Android 的 TextView 的 FindViewById 上的 NulPointer 异常

android - 适用于 Android 和 Unity 的 UIToolkit

python - 在python中将mp4声音转换为文本

android - 使用 Android NDK 为 x86 编译 FFmpeg 3.1.1