Android:使用NDK和轮询提高传感器采样率

时间:2012-02-12 15:48:59

标签: android performance android-ndk android-sensors

我想编写一个应用程序,从不同的传感器(GPS,Acc,Gyro,Compass)读取尽可能多的传感器存储(每次)。所以我必须调查使用NDK是否有优势。

以下是我的问题:

a)从传感器读取传感器值时的瓶颈是什么?是senosr本身还是Java?我可以使用NDK来提高费率吗? (我认为GPS的瓶颈是传感器本身,但我已经读过,例如陀螺仪传感器非常快) 我找到了this thread,似乎瓶颈就是传感器。有人可以证实这一点吗?

b)轮询而不是使用EventListener会增加速率吗?什么是快速读取传感器值的最佳方法?

c)NDK的使用对应用的功耗有影响吗?我没有找到任何关于此事的内容。

d)我是Android新手。使用NDK而不是普通的Java是否更有能力? 根据这个sample-code,使用事件队列与传感器进行交互似乎很简单,但编译代码并从应用程序中使用它有多大的负担?

提前致谢。

3 个答案:

答案 0 :(得分:2)

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的速度不应传感器问题。

您应该了解的另一件事是API级别26引入了SensorDirectChannel。我还没有尝试过,但是文档中提到RATE_VERY_FAST提供了440 Hz至1760 Hz。如果您的手机支持此功能...

答案 1 :(得分:0)

当您注册传感器监听器时,您需要将SensorManager.SENSOR_DELAY_FASTEST传递给registerListener()

有关详细信息,请参阅http://developer.android.com/reference/android/hardware/SensorManager.html

答案 2 :(得分:0)

根据经验,我至少可以回答你的第一个问题:

a)使用基础Java足以处理多个传感器。在我的一个应用程序中,我使用SENSOR_DELAY_FASTEST一次读取加速度计,陀螺仪,磁力计,游戏旋转矢量和未校准磁力计。

除此之外,我还做了一堆过滤和存储数据,以及一些四元数学来跟踪旋转。查看原始数据(我也保存为.txt文件),似乎没有任何丢失的数据或延迟(时间戳之间的平均差异与运行没有计算的单个传感器相同)。

所以在我的情况下,传感器工作速度尽可能快,而且Java保持良好状态。

...

也就是说,如果您正在进行大量计算,那么使用NDK可能值得尝试。