可以让传感器数据占用更少的CPU时间?

时间:2012-09-27 06:16:13

标签: android

我正在构建一个应用程序,其中一个加速度传感器需要高分辨率,但其他任何数据都没有数据。所以,当我正在听这个事件时,我正在做以下事情:

 mSensorManager.registerListener(this, mAccelerometer,
      SensorManager.SENSOR_DELAY_FASTEST);
事实上,每当传感器发生变化时事件就会发生,并且会进行检查 - 浪费了大量的CPU时间,这可以用来做更好的事情。

有没有办法保存这个CPu时间?

4 个答案:

答案 0 :(得分:1)

尝试另一面旗帜:

SENSOR_DELAY_FASTEST    //get sensor data as fast as possible
SENSOR_DELAY_GAME       //rate suitable for games
SENSOR_DELAY_NORMAL     //rate (default) suitable for screen orientation changes
SENSOR_DELAY_UI         //rate suitable for the user interface

答案 1 :(得分:1)

从API 3开始,您可以注册一个传感器。使用下面的方法:

    try {
        sensorMgr = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);

        sensors = sensorMgr.getSensorList(Sensor.TYPE_ACCELEROMETER);
        if (sensors.size() > 0) sensorGrav = sensors.get(0);

        sensorMgr.registerListener(this, sensorGrav, SensorManager.SENSOR_DELAY_FASTEST);

    } catch (Exception ex1) {
        try {
            if (sensorMgr != null) {
                sensorMgr.unregisterListener(this, sensorGrav);
                sensorMgr = null;
            }
        } catch (Exception ex2) {
            ex2.printStackTrace();
        }
    }

只会调用加速度传感器中的监听器。

祝你好运。

答案 2 :(得分:1)

  

我不希望为每个传感器调用一个函数,只是我感兴趣的那个传感器

这就是Android的工作方式,但只有在您注册多个传感器时才会发生这种情况。如果您想要读取多个传感器,您可以使用switch-case过滤您喜欢的传感器。

@Override
public void onSensorChanged(SensorEvent event) {
    synchronized (this){
        switch (event.sensor.getType()) {
            case Sensor.TYPE_ACCELEROMETER:
                //Do your magic here
                break;
            case Sensor.TYPE_MAGNETIC_FIELD:
                System.arraycopy(event.values, 0, magneticFieldValues, 0,
                        event.values.length);
                break;
        }
    }
}
  

有没有办法节省这个CPU时间?

你真的需要SENSOR_DELAY_FASTEST吗?你读的最快,你耗尽电池的速度最快。如果你更改了它,你将节省CPU时间,因为你不必像使用SENSOR_DELAY_FASTEST那样多次读取传感器,也不会在onSensorChanged方法执行那么多次

请记住,使用FASTEST, GAME, NORMAL or UI并不意味着在发生更改时获取数据的速度有多快。它表示设备读取已注册传感器的频率(如果值相同或无关,则无关紧要),如果最后一个值与刚刚读取的值不同,则执行onSensorChanged方法(均来自同一传感器)。

答案 3 :(得分:1)

你只需要听一个传感器:

    sensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
    accSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    sensorManager.registerListener(this, accSensor, SensorManager.SENSOR_DELAY_GAME);

就性能而言,根据我的经验,即使是最快的也不会对性能产生重大影响,但仍有一些需要记住。它们到达时的值应立即转储到另一个线程中进行处理。执行传感器线程中的所有处理可能会影响未来样本的性能或交付时间。

将值复制出SensorData,不要保留对values数组的引用。这些是固定池的一部分,可能会在以后重复使用,并且您不希望在您的代码下更改这些池。

如果您对精度有任何顾虑,通常不适合使用SENSOR_DELAY_FASTEST。速度是以拥有紧张不安的数据为代价的。将传感器数据最快地转储到lof并将设备放在稳定的平面上。它仍然会丢弃大量的样本,因为它认为报告有很多变化,而使用SENSOR_DELAY_GAME时,样本会缓慢下降,因为没有任何报告,这是正确的。摩托罗拉是另一个故事,因为他们积极地压制重复样品并在平面上设置设备将看到报告的样品数量变为0。