a) 从传感器读取传感器值时的瓶颈是什么?
(小心:这只是我的印象和推理。除了我开发应用程序“phyphox”的经验外,我没有这方面的资料,该应用程序记录用于物理实验的传感器数据。)
我不确定这是否应该称为“瓶颈”,但似乎SENSOR_DELAY_FASTEST 的费率是制造商的设计选择。 SENSOR_DELAY_FASTEST 通常会产生大约 100Hz 的速率,但某些设备(Nexus/Pixel、一些 Smasung 旗舰)在相同设置下提供高达 500Hz 的速率。如果您读出传感器的制造商和型号,您通常可以找到实际设备的数据表,您会注意到,它们通常可以驱动得更快。我认为速率是快速速率和合理噪音之间的权衡。
此外,(也许更重要的是)如果制造商为SENSOR_DELAY_FASTEST 设置了较高的费率,这可能会影响电池寿命。不仅手机必须读取每个值(如果手机为此配备专用处理器,则该处理器需要具有必要的带宽),许多应用程序使用SENSOR_DELAY_FASTEST 设置时没有太多考虑。每个值都会调用回调函数来获取新值,因此频率为 500 Hz 的手机必须以相同的速率调用此函数,并且可能会在应用程序中出现编码错误的例程,而该应用程序似乎在设备上运行顺畅提供 100 Hz。
b) 轮询而不是使用 EventListener 会提高速率吗?快速读取传感器值的最佳方法是什么?
我不知道直接轮询传感器的方法。在您链接的线程中,术语“轮询”用于“轮询”传感器已填充的数据队列。如果有人可以在这里通过展示一种直接在 Android 上轮询传感器的方法来纠正我,我会很高兴...
c) NDK 的使用对应用程序的功耗有影响吗?我没有找到任何关于此的信息。
如果您可以通过更高效的本机例程来减少计算负载,它显然是有好处的。如果您可以优化一些原本繁重的计算,我只会期望产生明显的影响。
d) 我是 Android 新手。使用 NDK 比使用普通 Java 更划算吗?根据这个示例代码,使用事件队列与传感器进行交互似乎很简单,但是编译代码并从应用程序中使用它的成本是多少?
这是相当主观的,但是设置和学习如何使用 NDK 及其接口需要我一段时间。一旦你运行它,扩展你的代码和重新编译就可以在 Android Studio 中无缝地工作。
--
我不完全知道您打算如何处理传感器数据,但您应该考虑到 Java 可以轻松处理通常以 48 kHz 记录的音频数据。当然,音频样本是写入缓冲区的 16 位值,而不是传递给回调的 SensorEvent 对象,但您仍然可以使用 Java 实时迭代每个样本,因此除非您计划进行一些花哨的分析,否则 Java 的速度不应该是传感器的问题。
您应该注意的另一件事是 SensorDirectChannel 在 API 级别 26 中引入。我还没有尝试过,但文档提到 RATE_VERY_FAST 提供 440 Hz 至 1760 Hz。如果你的手机支持这个...