好的 --- 我是不是快要发布我的音频分析应用程序了,我发现使用核心音频的 monotouch 存在问题。Monotouch 实际上具有核心音频/远程 io 的绑定,并且由 Miguel 编写的示例运行良好。这在 99% 的时间里都很好用。问题出现在我认为“停止世界”垃圾收集器发生在 coreaudio 的渲染回调期间。那时我们处于托管代码中,所以我可以认为渲染回调在 gc 完成之前不会返回。因此,每 160 帧中大约有 1 帧被丢弃(大约每 2 到 4 秒)。
所以我有三个选择,没有智慧知道哪个是浪费时间。
在 c 中编写代码音频渲染回调(以及所有其他核心音频接口代码)。然后我可以在我的托管代码可以分析它的情况下快速获取样本。即使我暂停 20 毫秒,这也可以避免丢帧。我的主要问题是我可以用单点触控做到这一点吗?如果完全不受管理,核心音频回调函数会被 gc 停止吗?然后我可以有一个非托管循环队列,我可以根据需要调用它来读取数据。
只需以某种方式调整 gc 以降低效率但减少世界暂停时间。如果它总是低于 5 毫秒,我们可能是安全的。我不知道如何在 xamarin 工作室做到这一点。它只是一堆链接器选项还是什么?
使用另一个 API。我已经尝试过输入队列 API,但延迟很糟糕。有中间立场吗?
我知道 CoreAudio 很棒,但不得不承认这个应用程序的 Android 端口在这方面要快 100 倍,以满足我的需求。