我想写一个应用程序,读取尽可能多的传感器金库(每次)从不同的传感器(GPS,Acc,陀螺,指南针)。因此,我必须调查使用NDK是否有优势。
以下是我的问题:
a)从传感器读取传感器值时的瓶颈是什么?是senosr本身还是Java?我可以使用NDK来提高速率吗?(我认为全球定位系统的瓶颈是传感器本身,但我读到过,例如陀螺传感器相当快)我找到了this thread,似乎瓶颈是传感器。有人能证实这一点吗?
b)轮询而不是使用EventListener会提高速率吗?快速读取感应值的最好方法是什么?
c) NDK的使用对应用的功耗有影响吗?我没有找到任何关于这个的东西。
d)我是Android的新手。使用NDK而不是普通的Java更划算吗?根据这个sample-code,使用事件队列与传感器交互似乎很简单,但是编译代码并从应用程序中使用它的成本有多高?
提前谢谢。
发布于 2019-10-10 04:35:49
a)从传感器读取传感器值时的瓶颈是什么?
(小心:这只是我的印象和推理。除了我开发应用程序"phyphox“的经验之外,我没有这个方面的来源,它记录了用于物理实验的传感器数据。)
我不确定这是否应该被称为“瓶颈”,但似乎SENSOR_DELAY_FASTEST的速率是制造商的设计选择。SENSOR_DELAY_FASTEST通常会产生100 the左右的速率,但一些设备(Nexus,一些Smasung旗舰产品)在相同设置下提供高达500 the的速率。如果你读出传感器的制造商和型号,你经常可以找到实际设备的数据表,你会注意到,它们通常可以更快地驱动。我认为这个速率是在快速速率和合理噪音之间的权衡。
此外,(也许更重要的是)如果制造商将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的速度应该不是问题。
您应该知道的另一件事是在API26中引入的SensorDirectChannel。我还没有尝试过,但是文档中提到RATE_VERY_FAST提供440 Hz到1760 Hz的频率。如果你的手机支持这个功能...
发布于 2012-09-23 19:04:35
注册传感器侦听程序时,需要向registerListener()传递SensorManager.SENSOR_DELAY_FASTEST。
有关更多详细信息,请参阅http://developer.android.com/reference/android/hardware/SensorManager.html。
发布于 2015-06-25 18:33:48
根据经验,我至少可以回答你的第一个问题:
a)使用base Java处理多个传感器的速度足够快。在我的一个应用程序中,我用SENSOR_DELAY_FASTEST一次读取了加速计、陀螺仪、磁强计、游戏旋转矢量和未校准的磁强计。
最重要的是,我还做了一系列的数据过滤和存储,以及一些四元数数学来跟踪旋转。查看原始数据(我也将其保存到.txt文件),似乎没有任何数据丢失或延迟(时间戳之间的平均差异与运行单个传感器而不进行计算相同)。
因此,在我的例子中,传感器正在以最快的速度工作,而Java则保持得很好。
..。
也就是说,如果你在做大量的计算,使用NDK可能值得一试。
https://stackoverflow.com/questions/9250121
复制相似问题