2011-11-22 33 views
6

Estoy tratando de leer varios sensores de un Samsung Galaxy Tab GT-P1000 y parecen estar acaparando bastante mal la CPU en relación con las aplicaciones que he utilizado.Android Sensor Uso de la CPU

Como prueba, he creado un pequeño programa que implementa el SensorEventListener para el sensor acelerómetro, pero no hace nada con las lecturas del sensor:

public class SensorTestActivity extends Activity implements SensorEventListener { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     SensorManager oSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE); 
     oSensorManager.registerListener(this, oSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_GAME); 
    } 

    @Override 
    public void onAccuracyChanged(Sensor sensor, int accuracy) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onSensorChanged(SensorEvent event) { 
     // TODO Auto-generated method stub 

    } 
} 

Esto se traduce en el uso de CPU constante del 10% mientras estoy de depuración (es decir, mi dispositivo está conectado a mi PC) y el 5% de uso, mientras que yo no. Si uso SENSOR_DELAY_FASTEST, el uso se dispara hasta el 30% constante mientras estoy depurando y el 20% mientras no lo estoy.

Esto crea un gran problema cuando quiero usar varios sensores, ya que todos tienen un uso elevado de la CPU y eso es sin procesamiento de datos. He usado aplicaciones Compass de Android Market y ninguna de ellas usa más del 5% de la CPU en un momento dado, así que siento que me falta algo obvio, pero no puedo encontrar a nadie más que tenga el mismo problema. .

No he editado el archivo de manifiesto o el diseño de esta aplicación: es la plantilla predeterminada creada por Eclipse y he agregado el sensor.

ACTUALIZACIÓN: Mi método de lectura del uso de la CPU es defectuoso, porque estaba usando el administrador de tareas para medirlo. Mi aplicación no detiene los sensores usando onPause cuando se abre el administrador de tareas, mientras que la mayoría de las otras aplicaciones lo harían.

Respuesta

4

Esto da como resultado un 10% de uso constante de la CPU mientras estoy depurando (es decir, mi dispositivo está conectado a mi PC) y un 5% de uso mientras que yo no. Si uso SENSOR_DELAY_FASTEST, el uso se dispara hasta el 30% constante mientras estoy depurando y el 20% mientras no lo estoy.

A continuación, utilice SENSOR_DELAY_UI o SENSOR_DELAY_NORMAL, ambos de los cuales actualización que con los datos del sensor con menos frecuencia y en consecuencia debe consumir menos tiempo de CPU.

He usado aplicaciones Brújula desde el Android Market y ninguno de ellos utilizan más de un 5% de la CPU en un momento dado

Probablemente no utilizan SENSOR_DELAY_GAME o SENSOR_DELAY_FASTEST.

Más allá de eso, diferentes dispositivos (quizás con diferentes conjuntos de chips de sensores) pueden dar como resultado una utilización diferente de la CPU. Por ejemplo, algunos dispositivos son molestamente habladores en LogCat: los dispositivos que se registran según las lecturas del sensor serían proporcionalmente más lentos.

Además, no sé cómo se mide la utilización de la CPU, pero no conozco ningún medio oficialmente compatible para hacerlo. Me centraría en cosas como la velocidad de fotogramas en tu juego o lo que sea que estés escribiendo.

+0

Fui bastante tonto con mi afirmación sobre la utilización de la CPU: medí el uso en el Administrador de tareas, olvidando que la mayoría de las aplicaciones PONER EN PAUSA los sensores cuando hago eso y, por lo tanto, dar una lectura realmente pequeña. Mi aplicación, por otro lado, no detuvo los sensores en un método onPause anulado. Quizás la mejor manera de resolver esto es intentar establecer mis propios retardos personalizados o uno de los dados, porque agregar más sensores como el magnómetro o el giroscopio realmente podría hacer que las cosas se pongan feas. – Namdrater

+0

@ user1021922: No puede crear retrasos personalizados, lo siento. – CommonsWare