ios - Objective-C 中的高性能缓冲区

标签 ios objective-c audio collections buffer

我想知道 Objective-C 中音频数据最适用的缓冲区实现类型是什么。我在 iPhone 上处理音频数据,在录制或播放时对音频数据进行一些直接数据操作/DSP,因此性能很重要。我从事 iPhone 开发已有几个月了。目前我正在处理元素类型 SInt16 或 Float32 的 c 数组,但我正在寻找更好的东西。

据我所知,指针迭代的 c 数组的性能在 Objective-C 环境中是无与伦比的。然而,指针算术和 C 数组很容易出错。您始终必须确保不会超出其范围访问数组。如果这样做,您不会立即收到运行时错误。并且您必须手动确保正确分配和释放数组。

因此,我正在寻找替代方案。有哪些高性能替代方案? Objective-C 中是否有类似于 C++ 风格的 std::vector 的东西?

类似我的意思是:

  • 良好的表现
    • 可通过基于指针/迭代器的循环进行迭代
    • 没有将 Float32 或 SInt16 等基本数据类型装箱/拆箱到 Objective-C 对象中的开销(顺便说一句,objective-c 中“基本数据类型”的正确用词是什么?)
  • 边界检查
  • 可以将其他列表或数组的 block 复制/读取/写入我的搜索列表实现
  • 包含内存管理

我已经搜索并阅读了很多内容,当然 NSDataNSMutableArray 是提到的解决方案之一。然而,由于基本数据类型的装箱/拆箱的开销,它们不会使处理成本加倍吗?代码看起来非常丑陋,就像一个简单的“设置”操作变成了一些名为 replaceObjectAtIndex:withObject: 的恐龙,这并不是我关心的,但它仍然微妙地让我认为这个类不是为我。

最佳答案

NSMutableData 满足了您的要求之一,因为它将 Objective-C 内存管理语义引入了普通 C 缓冲区。你可以这样做:

NSMutableData* data = [NSMutableData dataWithLength: sizeof(Float32) * numberOfFloats];
Float32* cFloatArray = (Float32*)[data mutableBytes];

然后您可以将 cFloatArray 视为标准 C 数组并使用指针迭代。当 NSMutableData 对象被释放时,支持它的内存将被释放。它不提供边界检查,但它提供内存管理帮助,同时保留 C 数组的性能。

此外,如果您需要工具帮助解决边界检查问题,请阅读 Xcode 的 Malloc Scribble、Malloc Guard Edges 和 Guard Malloc 选项。这些将使运行时对边界问题更加敏感。在生产中没有用,但有助于解决开发过程中的问题。

关于ios - Objective-C 中的高性能缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16356486/

相关文章:

ios - 如何动态更改 UITableView 中单元格的高度?

ios - 关于 HERE ios SDK、许可证 key 、应用程序 ID 或应用程序代码未设置。 (NMA套件)

c++ - C++中的简单声音

ios - Swift Eureka Storyboard

ios - 从 View Controller 访问变量到覆盖函数

android - 如何从Flutter访问设备应用

iphone - 来自 NSData 的整数

ios - 我应该在 Objective-C 的 View Controller 中的何处初始化自定义类?

javascript - 如何在 iPad 上使用 HTML5/Javascript 合成音频

java - 如何在Java中的两个混合器之间创建 "connection"?