安卓系统:通过使用NDK和轮询来提高传感器采样率



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

以下是我的问题:

a) 从传感器读取传感器值时的瓶颈是什么?是senosr本身还是Java?我可以使用NDK来提高费率吗?(我认为GPS的瓶颈是传感器本身,但我读到过,例如陀螺仪传感器速度很快)我发现了这个线程,似乎瓶颈是传感器。有人能证实吗?

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

c) NDK的使用对应用程序的功耗有任何影响吗?我什么也没发现。

d) 我是安卓系统的新手。使用NDK而不是普通Java是否更实惠?根据这个示例代码,使用事件队列与传感器交互似乎很简单,但编译代码并从应用程序中使用它的成本是多少?

提前谢谢。

a)从传感器读取传感器值时的瓶颈是什么

(小心:这只是我的印象和推理。除了我开发应用程序"phyphox"的经验外,我没有其他来源,该应用程序记录了物理实验中使用的传感器数据。)

我不确定这是否应该被称为"瓶颈",但似乎SENSOR_DELAY_FASTEST的费率是制造商的设计选择。SENSOR_DELAY_FASTEST通常导致100Hz左右的速率,但一些设备(Nexus/Pixel,一些Smasung旗舰)在相同设置下提供高达500Hz的速率。如果你读出传感器的制造商和型号,你通常可以找到实际设备的数据表,你会注意到,它们通常可以更快地驱动。我认为速率是在快速速率和合理噪声之间的权衡。

此外,(也许更重要的是)如果制造商为SENSOR_DELAY_FASTEST设置了高速率,这可能会对电池寿命产生影响。手机不仅必须读出每个值(如果手机有一个专用处理器,这个处理器需要有必要的带宽),许多应用程序使用SENSOR_DELAY_FASTEST设置时也没有太多考虑。每个值都会为一个新值调用回调函数,因此速率为500赫兹的手机将不得不以相同的速率调用该函数,并且可能会在一个应用程序中显示出一个编码错误的例程,该例程似乎在提供100赫兹的设备上运行得很顺利。

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

我不知道有什么方法可以直接轮询传感器。在链接的线程中,术语"轮询"用于"轮询"传感器已填充的数据队列。如果有人能在这里纠正我的错误,展示一种直接在Android上轮询传感器的方法,我会很高兴。。。

c) NDK的使用对应用程序的功耗有任何影响吗?我什么也没发现

如果您可以通过更高效的本机例程来减少计算负载,那么它显然是可行的。只有当你能够优化一些繁重的计算时,我才会期望产生显著的影响。

d) 我是安卓系统的新手。使用NDK而不是普通Java是否更实惠?根据这个示例代码,使用事件队列与传感器交互似乎很简单,但编译代码并从应用程序中使用它的成本是多少

这是相当主观的,但设置和学习如何使用NDK及其接口花了我一段时间。一旦你运行了它,扩展你的代码和重新编译在安卓工作室中似乎毫无效果。

--

我不知道您打算如何处理传感器数据,但您应该考虑到Java可以轻松处理音频数据,这些数据通常以48 kHz的频率记录。诚然,音频样本是写入缓冲区的16位值,而不是交给回调的SensorEvent对象,但您仍然可以使用Java实时迭代每个样本,因此,除非您计划进行一些奇特的分析,否则Java的速度对传感器来说应该不是问题。

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

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

请参阅http://developer.android.com/reference/android/hardware/SensorManager.html了解更多详细信息。

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

a) 使用基本Java对于处理多个传感器来说足够快。在我的一个应用程序中,我使用SENSOR_DELAY_FASTEST同时读取了加速计、陀螺仪、磁强计、游戏旋转矢量和未校准磁强计。

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

因此,在我的案例中,传感器以最快的速度工作,Java保持良好。

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

最新更新