2011-11-22 7 views
6

Sto provando a leggere più sensori da un Galaxy Tab GT-P1000 di Samsung e sembra che stiano facendo un po 'male alla CPU rispetto alle applicazioni che ho usato.Utilizzo sensore CPU Android

Come prova, ho creato un breve programma che implementa la SensorEventListener per il sensore accelerometro, ma non fa nulla con le letture del sensore:

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 

    } 
} 

Ciò si traduce in un uso costante della CPU del 10%, mentre io sono il debug (cioè il mio dispositivo è collegato al mio PC) e il 5% di utilizzo mentre non lo sono. Se uso SENSOR_DELAY_FASTEST, l'utilizzo sale a costante del 30% mentre eseguo il debug e il 20% mentre non lo sono.

Questo crea un problema enorme quando voglio usare sensori multipli, perché tutti hanno elevato utilizzo della CPU e questo è senza alcuna elaborazione dei dati. Ho usato le applicazioni Compass dall'Android Market e nessuno di loro usa più del 5% della CPU in un dato momento, quindi mi sento come se mi mancasse qualcosa di evidentemente ovvio, ma non riesco a trovare nessun altro con lo stesso problema .

non ho modificato il file manifesto o il layout per questa applicazione - è il modello predefinito fatta da Eclipse e ho aggiunto il sensore.

UPDATE: Il mio metodo di lettura l'utilizzo della CPU è difettosa, perché stavo usando il task manager per misurarla. La mia applicazione non interrompe i sensori usando onPause quando si apre il task manager, mentre la maggior parte delle altre applicazioni lo farebbero.

risposta

4

Ciò comporta un utilizzo costante della CPU del 10% mentre eseguo il debug (ovvero il mio dispositivo è collegato al mio PC) e il 5% di utilizzo mentre non lo sono. Se uso SENSOR_DELAY_FASTEST, l'utilizzo sale a costante del 30% mentre eseguo il debug e il 20% mentre non lo sono.

Quindi utilizzare SENSOR_DELAY_UI o SENSOR_DELAY_NORMAL, entrambi i quali aggiornamento con i dati del sensore meno frequentemente e dovrebbe consumare corrispondentemente meno tempo di CPU.

Ho usato le applicazioni bussola da Android Market e nessuno di loro uso più del 5% della CPU in un dato momento

Probabilmente non usano SENSOR_DELAY_GAME o SENSOR_DELAY_FASTEST.

Oltre a ciò, dispositivi diversi (forse con chipset di sensori diversi) possono comportare un diverso utilizzo della CPU. Ad esempio, alcuni dispositivi sono fastidiosamente chiacchieroni in LogCat - i dispositivi che effettuano il log in base alle letture del sensore sarebbero più lenti in modo commisurato.

Inoltre, io non so come si sta misurando l'utilizzo della CPU, ma io non sono a conoscenza di qualsiasi mezzo ufficialmente supportati per farlo. Mi concentrerei invece su cose come frame rate nel tuo gioco o qualunque cosa tu stia scrivendo.

+0

ero abbastanza sciocco con la mia dichiarazione circa l'utilizzo della CPU - ho misurato l'utilizzo nel Task Manager, dimenticando che la maggior parte delle applicazioni PAUSE i sensori quando faccio questo e, quindi, dare davvero un piccolo lettura. D'altro canto, la mia applicazione non aveva fermato i sensori in un metodo onPause sovrascritto. Forse il modo migliore per risolvere questo è provare a impostare i miei ritardi personalizzati o uno di quelli dati, perché l'aggiunta di più sensori come il magnometro o il giroscopio potrebbe davvero causare brutte cose. – Namdrater

+0

@ user1021922: non è possibile creare ritardi personalizzati, mi dispiace. – CommonsWare